0

我想存储大约 100k 行数据,以及所有数据一些公共字段。所有数据都有一个类别,其他字段基于类别。

例如,如果数据属于类别 1,则它具有extrafield1并且extrafield2

我搜索并找到了两种存储数据的方法。

1-名称值对

Table1
ID    Name     Category   Field2           Field3
1     Name1    1          Value            Value
2     Name2    2          Value            Value

Table2 
ID    Table1_ID         Name           Value
1     1                 extrafield1    1
2     1                 extrafield2    2
3     1                 extrafield3    3
4     2                 extrafield4    4
5     2                 extrafield5    5

2-父子表

Table1
ID    Name     Category   Field2           Field3
1     Name1    1          Value            Value
2     Name2    2          Value            Value

Tableforcategory1 
ID    Table1_ID         extrafield1    extrafield2     extrafield3
1     1                 1              2               3


Tableforcategory2 
ID    Table1_ID         extrafield4    extrafield5
1     2                 4              5   

所以我的问题是何时使用方法 1和何时使用方法 2

4

2 回答 2

1

出于多种原因,通常首选方法 2:

  • 它更紧密地模拟不同类别所代表的实体。
  • 它允许列具有不同的数据类型。
  • 它使为仅值列实现检查约束变得更加容易。
  • 它使为引用列实现外键约束变得更加容易。
  • 如果这些是适当的,它可以更容易地实现独特的约束。
  • 它使实现非空值和默认值变得更容易。
  • 它使在特定属性值上添加列变得更加容易。

而且可能还有其他原因。

第一种方法——称为实体属性值建模 (EAV)——绝对是一种替代方法。它主要适用于两种情况:

  • 属性的数量超过了正在使用的数据库中的列限制。
  • 这些属性是稀疏填充的,因此对于任何给定的实体只有少数属性在使用。

有时这两种方法的混合是合适的,常用的属性以关系格式存储,稀疏属性存储为 EAV。

还有其他方法,例如将值存储在 JSON 或 XML 对象中。这些通常不被推荐,但在某些情况下可能适用于某些数据库 - 特别是当所有属性需要被视为单个块并一起返回和设置时。

于 2016-01-10T15:12:50.847 回答
0

这取决于查询的类型和数据模型的稳定性。

如果您的查询本质上是静态的,这意味着您知道何时要使用“extrafield_x”,那么方法 1 更简单、更有效,但灵活性较低。

如果您需要更多动态查询,并且及时可能需要更多类别和更多“额外字段”,方法 1 更灵活,无需维护数据模型,但使用起来更复杂,可能更慢。

于 2016-01-10T15:14:29.337 回答