我们的客户为产品做广告,但是产品的属性却大不相同。产品“类别”几乎与产品一样多。

最初,我们创建了一个EAV数据库,在其中我们为产品的每个“类”添加和删除了属性。整个过程效果很好,但是复杂性却使人 NumPy 。 ,这是数据库#1。

我们最终提出了一组代表所有产品(POCO)的通用字段,将“额外”字段移到了“全部捕获” XML字段。 ,这是数据库2。

现在,我们有一些使用旧版本的客户,一些将使用新版本的客户。实际上,我们确实不想更新旧版本,但是由于EAV结构的原因,我们有时会花费比所需时间更长的更改。

问题:

  • 关于如何对EF进行编码以将POCO持久保存到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,请参见:

  • MSDN documentation
  • C# 4.0: Introducing the Expando Object
  • 在这里:What are the true benefits of ExpandoObject?
  • Dynamic in C# 4.0 - Introducing the ExpandoObject
  • 关于c# - Entity Framework 4的示例: Mapping POCOs to EAV database?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3825172/

    10-12 13:53