我们的客户为产品做广告,但是产品的属性却大不相同。产品“类别”几乎与产品一样多。
最初,我们创建了一个EAV数据库,在其中我们为产品的每个“类”添加和删除了属性。整个过程效果很好,但是复杂性却使人 NumPy 。 ,这是数据库#1。
我们最终提出了一组代表所有产品(POCO)的通用字段,将“额外”字段移到了“全部捕获” XML字段。 ,这是数据库2。
现在,我们有一些使用旧版本的客户,一些将使用新版本的客户。实际上,我们确实不想更新旧版本,但是由于EAV结构的原因,我们有时会花费比所需时间更长的更改。
问题:
正常当然是指博伊斯·科德的正常形式。
我们通过将旧数据库的结构放到软件中,然后映射到存储库中的POCO来处理旧数据库。
最佳答案
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,请参见:
关于c# - Entity Framework 4的示例: Mapping POCOs to EAV database?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3825172/