我最近继承了一个严重依赖EAV数据库结构的系统,并且从性能角度来看确实很困难。
我想要做的是使用nhibernate或其他合适的ORM产品将这些EAV表映射到实体,以便我们可以将行映射到属性。然后我们可以重构数据库以使其成为关系数据库。有谁知道这是否可能?一个例子也将不胜感激! :)
为了让您对结构有所了解,它看起来像这样:
实体(EntityId) EntityVarchar(EntityId,VarcharValue) EntityFloat(EntityId,VarcharValue)
等等。如果我有一个Customer实体,我想说Customer.Name来获取名称而不是Customer.Varchar [“Name”]。
请注意我们的系统中没有必要使用EAV模型,我们不允许对数据结构进行运行时更改,我认为无论如何这都是一种不好的做法。
答案 0 :(得分:1)
我认为这不会那么容易。虽然有些生成器能够读取数据库模式并生成适当的映射和类,但这只会导致现有eav db的访问层。要生成此db的关系版本,您必须读取数据并创建包含db中设置的值的属性的新域对象。 这很可能导致一个包含eav db中存在的所有属性的大表。因此,我认为更好的方法是通过手工分析现有数据并考虑应用程序的需求来创建关系数据库模型。特别是Table继承应该是你的朋友。 然后,在为两个模式创建访问层之后,您仍然必须为数据迁移编写映射。