我有3个对象:Report
,ReportCondition
和ConditionValue
。关系是:Report
有许多ReportConditions
(例如personID,姓名和出生日期),ReportCondition
有许多ConditionValues
(例如,用于查询personID的多个ID)。理想情况下,ConditionValue
由2个字段组成:ID
和value
。由于报表的条件可能引用各种对象和属性(如上面的示例),条件值的数据类型可能是integers
(具有业务数据的表中某些其他对象的主键ID),strings
或(目前未计划其他类型)。
我看到3个解决方案:
将dates
设置为ConditionValue.value
并存储该值所在的任何数据类型。看来最简单。
在varchar
记录中创建单独的intValue
,stringValue
和dateValue
字段,并将相关值存储在相关的数据类型字段中,接受每个记录将具有2个空字段。
为每种条件数据类型创建单独的表-这对于查询而言似乎过于复杂。ConditionValue
方法是否正确?在这种情况下最好的解决方案是什么?
最佳答案
选项1很流行,通常称为Entity-Attribute-Value。
这具有一些缺点。
对所有内容使用varchar意味着您不能依靠数据类型来强制有效性。例如,没有什么可以阻止您为应该是数字或日期的值存储“香蕉”。
Varchar需要更多空间来存储数字或日期值。
您将失去使用诸如UNIQUE或FOREIGN KEY之类的约束的能力。
但是,可能弊端较小。
最终,“最佳”解决方案取决于您如何查询它。