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 解决方案可能是更“紧凑”的替代方案.
我有一个数据库,里面有很多实验的数据。这些实验包含一些通用属性,但也包含一些特定于实验的属性。作为一个小例子,数据库可以是这样的:
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 解决方案可能是更“紧凑”的替代方案.