如何设计不修复表的列的模式

时间:2010-05-28 20:33:13

标签: sql database database-design data-modeling

我正在尝试设计一个不修复表的列的模式。例如:我有一个Employee表,其中表的列不固定且不同(Employee的属性不固定且不同)。需要频繁添加新属性/列。

  1. Employee表中的可为空的列,即没有规范化

  2. 不是添加可空列,而是将这些列分别列在各自的表中:如果Address是要添加的列,则创建表地址[EmployeeId,AddressValue]。

  3. 创建表ExtensionColumnName [EmployeeId,ColumnName]和ExtensionColumnValue [EmployeeId,ColumnValue]。 ExtensionColumnName将ColumnName作为“Address”,ExtensionColumnValue将ColumnValue作为地址值。

    员工表
    雇员
    姓名

    ExtensionColumnName表
    ColumnNameId
    雇员
    的ColumnName

    ExtensionColumnValue表
    雇员
    ColumnNameId
    ColumnValue

  4. 前两种方式有一个缺点,因为架构随每个新属性而变化。请注意,添加新属性是经常需要的。

    我不确定这是好的还是坏的设计。如果某人有类似的决定,请提供有关外键/数据完整性,索引,性能,报告等内容的见解。

6 个答案:

答案 0 :(得分:3)

查看当前的NoSQL数据库可能很有用,它允许您为每条记录存储任意一组键值对。

我建议你看看couchdb,mongodb,lucene等......

如果架构在SQL数据库中经常更改,则最终会导致噩梦,特别是在报告时。

将所有内容放入(rowId,key,value)三元组中是灵活的,但由于记录数量庞大而速度较慢。

ERP供应商的方式只是制作他们确定的字段的模式,并在固定的命名列中添加大量的“弹性域”(即20个数字,20个字符串等)并使用查找表以查看哪个flexcolumn对应于什么。这为未来提供了一些灵活性,同时基本上具有静态模式。

答案 1 :(得分:2)

我建议使用数字2和3的组合。在可能的情况下,为地址等标准关联建模表。这是最理想的方法......

但是为了不断更改无法汇总到这样的逻辑分组的值,除EMPLOYEES表外还使用两个表:

  • EMPLOYEE_ATTRIBUTE_TYPE_CODES(两列,employee_attribute_type_code和说明)
  • EMPLOYEE_ATTRIBUTES(三列:员工ID为EMPLOYEES的外键,employee_attribute_type_code为EMPLOYEE_ATTRIBUTE_TYPE_CODES的外键,以及VALUE)

EMPLOYEE_ATTRIBUTES中,设置主键:

  • EMPLOYEE_ID
  • employee_attribute_type_code

这将阻止同一员工的重复属性。

答案 2 :(得分:1)

有一种模式,称为观察模式。

有关说明,请参阅以下问题/解答: one two three

一般来说,看起来像这样:

observation_model_02

例如,受试者员工,公司和动物都可以观察姓名(特质),受试者员工和动物可以有观察< em>重量(测量)和主题啤酒瓶可以观察标签(特质)和体积(测量)。这一切都适合模型。

答案 3 :(得分:1)

正如您所说,如果经常添加新属性,EAV数据模型可能适合您。

答案 4 :(得分:0)

将ExtensionColumn表合并为一个

Property:
    EmployeeID foreign key
    PropertyName string
    PropertyValue string

如果使用单调序列在所有对象表中分配主键,则单个属性表可以保存所有对象的属性。

答案 5 :(得分:0)

我会使用1和2的组合。如果您经常添加属性,我认为您无法处理数据要求。

我认为添加的一些属性属于另一个表。如果你继续添加像java认证,asp认证,...等属性,那么你需要一个认证表。这可以与列出可用认证的认证代码表相关。

像manager这样的属性可以是属性或关系表。如果员工之间有多个关系,那么请考虑具有关联类型的关系表。具有矩阵管理结构的组织将需要一个关联表。

地址和电话号码通常放在单独的表格中。像employee_id,address_type这样的地址键是合适的。如果需要历史记录,请在密钥中添加start_date列。

如果您保留历史记录,我建议在相应的列上使用start_date和end_date列。我尝试使用“start_date&lt; = date-being-consideration&lt;”时记录处于活动状态的关系。 end_date'是真的。 重量,眼睛颜色等属性