SQL:引用整个 table 的最佳方式

SQL: Best way to reference entire table

我有一个数据库,里面有很多实验的数据。这些实验包含一些通用属性,但也包含一些特定于实验的属性。作为一个小例子,数据库可以是这样的:

TABLE 1:

ID 属性 1 属性 2 exp_type more_attrs
1 x y type1 1
2 x2 y type1 2
3 x z type2 1

type1:

ID extra_attr1 extra_attr2
1 一个 c
2 ab c

type2:

ID other_attr1 other_attr2 other_attr3
1 d e f

其中所有实验都存储在一个通用的 table 中,并且有一些基于实验的特定额外信息。

目前,当我想在查询中加入这些 table 时,我获取 exp_type 并根据该值合并 table。但是,尽管支持加入主键,但这种工作方式感觉并不像预期的那样..

由于总是会出现新的实验类型,因此添加一列以引用每种可能的类型并不是一个真正的选择。

所以我的问题基本上是:这是要走的路吗?有没有更好的方法来引用 tables?还是我的数据库结构设计得很糟糕?什么是更好的设计?

如果您希望能够添加新类型,那么您的数据建模就有问题了。基本上,您必须修改所有引用实验的查询以包含新类型。

当然,您可以将此逻辑封装在视图中,并在每次添加(或修改)类型时更新视图。

尝试对此建模时需要考虑很多因素。

一种替代方法是实体属性值 (EAV) 模型。这基本上意味着将属性存储在单独的行中。但是,这有一些缺点,例如:

  • value往往是一个字符串。支持不同的类型很复杂。
  • 这些值在不同的行中,这很不方便。
  • 为给定实验搜索特定值组合有点复杂。

我可以想到两种替代方法。一种是将所有值存储在一个 table 中,为新类型修改 table。未使用的值将是 NULL.

另一种方法是在每一行中存储附加属性,通常使用JSON(但也可能有其他方法)。

如果大部分信息是通用的,JSON 方法会非常有效。

如果其他 table 具有对特定类型的外键引用,则使用单独 table 的原始方法 可以 非常有用。也就是说,有不同的方法。最佳方法视具体情况而定。

我会避免任何类型的 'horizontal' 结构(attr1、attr2 ... attrN 列)——这使得数据管理非常困难——并且总会有一些属性不适合现有的结构,您需要创建更多的列等。

我会创建两个 tables - 一个 table 用于属性(PK,名称,描述 + 可能的类型,种类等)(至少对于通用的,但我会包括所有可能的特定的或特定的属性 - 取决于实际需求,例如特定属性对多个实验的适用性)和另一个(关系)table 用于实验的属性值(链接到实验和属性)。

如果您需要针对不同实验类型的某种“模板”,则可能需要更多 table。

也考虑 Gordon 的回答 - 取决于其他约束(数据插入-更新-删除逻辑、历史管理、分析需求、客户端应用程序设计、使用的 DBMS)JSON 解决方案可能是更“紧凑”的替代方案.