具有可变数量的不同类型“属性”的模型。

nan*_*ana 3 mysql postgresql database-design

我想要一张显微镜载玻片表,除了基本 id、name、date_created 之外,每张载玻片还有许多可编辑的“属性”。

想象一张幻灯片有

  • 肿瘤类型
  • 染料类型
  • 描述
  • 注射日期

其他一些幻灯片可能有例如:

  • 患者姓名
  • 治疗后
  • 描述

我无法将所有这些存储在幻灯片表中,因为我希望用户能够选择使用过的属性或添加新的属性(如果他们愿意)。每个属性也应该有一个类型,因为有些是整数,有些是文本,有些是例如日期和时间,我很想为它们呈现一个小部件以简化这些值的编辑。

我计划使用MySQL,然后有人指出我使用PostgreSQL及其hstore,但这对我来说感觉像是一个边缘实验功能。有什么建议我应该怎么做?

这是我想出的,但对我来说感觉不对: +-UML 表示我要在这里解释的内容:)

此外,如果有任何不同,所有这些都将在 Django (Python) 中结束。

Cra*_*ger 5

hstore非常适合这项工作,而且绝不是实验性的;自 8.3 以来,它一直是 PostgreSQL 的一部分,并且由于CREATE EXTENSION.

唯一真正的问题hstore是并非所有客户端驱动程序都支持将hstore值转换为本地映射或字典,因此您可能需要使用 hstore sql 函数each将条目的属性作为表获取,从而有效地将hstore结果转换为子表结果。

我看到的唯一真正的选择是:

  • EAV风格的简单主从表。这会工作得很好,只是查询有点烦人,你会使用很多string_aggorarray_agg调用,而且它比hstore. 这种方法在数据库系统之间是完全可移植的。

  • 将属性存储为xml,这可以更容易地从某些应用程序中解析,并且可以使用xpath表达式上的功能索引进行索引。这种方法在某种程度上可以跨数据库系统移植,因为它应该适用于任何SQL/XML数据库。

  • 将属性存储为json,这很容易从大多数应用程序中使用,但目前不可索引并且目前对 SQL 非常不透明(期待未来 Pg 版本的改进)。这种做法有些PostgreSQL特有的,但你可以使用text/ memo/clob任何数据库字段来存储JSON。

至于重用已定义的属性,这是维护已知属性名称表的简单问题。如果您愿意,可以使用SELECT DISTINCT skeys(properties) FROM thetable;对 propertieshstore的查询即时生成它,但这会很慢,因此我建议维护一个单独的表。