我们的客户宣传产品,但产品的属性彼此差异很大。产品“类”几乎和产品一样多。
最初,我们创建了一个EAV数据库,我们为每个“类”产品添加和删除了属性。整个过程非常有效,但复杂性令人头脑麻木。 这是数据库#1。
我们最终提出了一组共同代表所有产品(POCO)的字段,将“额外”字段移动到XML字段“catch all”。 这是数据库#2。
现在我们有一些客户使用旧的和一些将使用新的客户。在我们需要这样做之前,我们真的不想更新旧版本,但由于EAV结构的原因,我们不时会因为需要更长的时间而更新。
问题:
正常当然是指Boyce Codd Normal Form。
我们通过将其结构放入软件,然后映射到存储库中的POCO来处理旧数据库。
答案 0 :(得分:10)
EAV表通常是一个混乱的业务,Joe Celko(在Avoiding the EAV of Destruction)和许多其他行业专家(例如Five Simple Database Design Errors You Should Avoid)正确地警告不要使用EAV结构太多。
除了所有数据库评论家:基于这样的EAV的.NET中的对象如何看起来像?它可以有任意类型的任意数量的属性,所以基本上,它必须是一个“通用”对象,可以采取任何形状,非常多。
这种想法使我的皮肤爬行并违背了强类型语言的最基本概念 - 是的,你可以在像Ruby和Python这样的动态语言中做类似的东西,但是在C#中?
你唯一可行的选择可能是.NET 4.0中的新“动态”类型和ExpandoObject - 一个可以呈现任何形状的对象,具有任何类型的任何属性,并且基本上是你想要的任何东西是。
你可以想象一下SQL Server中的EAV结构和C#4.0中的ExpandoObject之间的映射 - 但我非常怀疑EF团队在这方面做了什么,而且老实说,我认为他们不会很快。但这可能是你探索的可能性。
对于ExpandoObject,请参阅: