2009-07-18 68 views
4

我最近继承了一个严重依赖于EAV数据库结构的系统,并且从性能的角度来看真的很挣扎。nhibernate/orm支持eav吗?

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

为了给你一个感觉的结构,它看起来是这样的:

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

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

请注意,在我们的系统中不需要使用EAV模型,我们不允许运行时更改数据结构,我认为这是一个糟糕的做法。

回答

1

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

+0

使用nHibernate,您可以将实体映射到类中,使其与数据库模式不是1:1映射,因此您无需将自己牢固地连接到数据库。 我只是无法看到一个方法,在映射多个行的时刻,每个属性对应一个对象。通常你会有一行包含单个对象的数据。 – spooner 2009-07-18 10:37:34