【问题标题】:Can nhibernate/orm support eav?nhibernate/orm 可以支持 eav 吗?
【发布时间】:2009-07-18 08:52:36
【问题描述】:

我最近继承了一个严重依赖 EAV 数据库结构的系统,并且从性能角度来看确实很挣扎。

我想做的是使用 nhibernate 或其他合适的 ORM 产品将这些 EAV 表映射到实体,以便我们可以将行映射到属性。然后我们可以重构数据库以使其具有关系。有谁知道这是否可能?一个例子也将不胜感激! :)

为了让您了解结构,它看起来像这样:

实体 (EntityId) EntityVarchar (EntityId, VarcharValue) EntityFloat(EntityId, VarcharValue)

等等。如果我有一个客户实体,我想说 Customer.Name 来获取名称而不是 Customer.Varchar["Name"]。

请注意,我们的系统不需要使用 EAV 模型,我们不允许对数据结构进行运行时更改,而且我认为无论如何这是一种不好的做法。

【问题讨论】:

    标签: nhibernate orm entity-attribute-value


    【解决方案1】:

    我认为这不会那么容易。尽管有生成器能够读取数据库模式并生成适当的映射和类,但这只会导致现有 eav db 的访问层。要生成此数据库的关系版本,您必须读取数据并创建包含数据库中设置的值的属性的新域对象。 这很可能会导致一个包含 eav 数据库中存在的所有属性的大表。因此,我认为更好的方法是通过手动分析现有数据并考虑应用程序的需求来创建关系数据库模型。特别是表继承应该是你的朋友。 然后,在为这两个模式创建访问层之后,您仍然需要为数据迁移编写映射。

    【讨论】:

    • 使用 nHibernate,您可以将实体映射到类,而不是与 db 模式进行 1:1 映射,因此您不必将自己与数据库强耦合。在将多行映射到单个对象时,我只是看不到一种方法,每个属性一个。通常,您会有一行包含单个对象的数据。
    • 我知道,但除了您已经提到的以外,我认为没有任何可能以其他方式做您想做的事情。您可以在多对一上使用 filter-prop,但 imo 这无济于事,而且我认为这无论如何也无助于解决您的性能问题。也许我弄错了,但据我所知,您正在考虑将您的 eav 重构为关系或混合模式。如果您只将稀有道具作为 eavs 保存在袋子/套装中,您可以让它们懒惰,只按需加载。
    • 问题是我们真的不需要属性包,只有我们的开发人员会添加新的属性,我们不希望用户扩展模型。基本上,我继承的系统是建立在具有这种 EAV 结构的框架之上的。我们想要一个完全标准化的模型。我希望我们能够按照我建议的方式执行映射,因为我们可以为域模型设置基线,然后开始进行数据库工作。根据您的说法,这是不可能的,这很遗憾,因为似乎唯一的其他解决方案是手工制作的 DAL。
    • 也许这就是它被称为对象关系映射器的原因:)...是的,这就是重点:你不需要它,所以摆脱它。您投入的时间越多,使其工作得更好/更快,您获得正确的数据库架构和 DAL 的时间就越少。在遇到数据库问题之前,我真的认为您不会摆脱性能问题。在这里阅读(尤其是ayendes 评论):bestguesstheory.com/2009/06/nhibernate-eav-system-search.html
    • 感谢您的帮助。我会先从数据库端开始研究,这显然是这里真正的问题,然后我们可以应用 ORM。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多