名称值对表与父子

时间:2016-01-10 15:02:56

标签: sql database relational-database parent-child name-value

我想存储大约100k行数据,并且所有数据都存在一些常见字段。 所有数据都有一个类别,其他字段基于类别。

例如,如果数据属于类别1,则其为extrafield1extrafield2

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

1-Name value pair

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-Parent Child table

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 时。

2 个答案:

答案 0 :(得分:1)

出于各种原因,方法2通常是优选的:

  • 它更接近地模拟不同类别所代表的实体。
  • 它允许列具有不同的数据类型。
  • 这样可以更轻松地为仅值列实现检查约束。
  • 可以更轻松地为引用列实现外键约束。
  • 如果这些约束合适,它可以更容易地实现唯一约束。
  • 它可以更容易地实现非NULL和默认值。
  • 可以更轻松地在特定属性值上添加列。

可能还有其他原因。

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

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

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

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

答案 1 :(得分:0)

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

如果您的查询基本上是静态的,这意味着您知道何时使用" extrafield_x",那么方法1更简单,更高效,但灵活性更低。

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