我正在尝试设计一个不修复表的列的模式。例如:我有一个Employee表,其中表的列不固定且不同(Employee的属性不固定且不同)。需要频繁添加新属性/列。
Employee表中的可为空的列,即没有规范化
不是添加可空列,而是将这些列分别列在各自的表中:如果Address是要添加的列,则创建表地址[EmployeeId,AddressValue]。
创建表ExtensionColumnName [EmployeeId,ColumnName]和ExtensionColumnValue [EmployeeId,ColumnValue]。 ExtensionColumnName将ColumnName作为“Address”,ExtensionColumnValue将ColumnValue作为地址值。
员工表
雇员
姓名
ExtensionColumnName表
ColumnNameId
雇员
的ColumnName
ExtensionColumnValue表
雇员
ColumnNameId
ColumnValue
前两种方式有一个缺点,因为架构随每个新属性而变化。请注意,添加新属性是经常需要的。
我不确定这是好的还是坏的设计。如果某人有类似的决定,请提供有关外键/数据完整性,索引,性能,报告等内容的见解。
答案 0 :(得分:3)
查看当前的NoSQL数据库可能很有用,它允许您为每条记录存储任意一组键值对。
我建议你看看couchdb,mongodb,lucene等......
如果架构在SQL数据库中经常更改,则最终会导致噩梦,特别是在报告时。
将所有内容放入(rowId,key,value)三元组中是灵活的,但由于记录数量庞大而速度较慢。
ERP供应商的方式只是制作他们确定的字段的模式,并在固定的命名列中添加大量的“弹性域”(即20个数字,20个字符串等)并使用查找表以查看哪个flexcolumn对应于什么。这为未来提供了一些灵活性,同时基本上具有静态模式。
答案 1 :(得分:2)
我建议使用数字2和3的组合。在可能的情况下,为地址等标准关联建模表。这是最理想的方法......
但是为了不断更改无法汇总到这样的逻辑分组的值,除EMPLOYEES
表外还使用两个表:
employee_attribute_type_code
和说明)在EMPLOYEE_ATTRIBUTES
中,设置主键:
这将阻止同一员工的重复属性。
答案 2 :(得分:1)
有一种模式,称为观察模式。
有关说明,请参阅以下问题/解答: one , two , three
一般来说,看起来像这样:
例如,受试者员工,公司和动物都可以观察姓名(特质),受试者员工和动物可以有观察< 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'是真的。 重量,眼睛颜色等属性