我的应用程序是在C#下构建的,需要动态属性处理。该动态属性由最终用户处理,在我的每个业务对象中添加和删除新字段。
因此,我的方法是在每个对象上构建PropertyBag,例如:
public class Customer {
public string Name { get; set; }
public string Id { get; set; }
public string Phone { get; set; }
public PropertyBag UserProperties { get; set; }
}
PropertyBag
我们正在实现的类基于本文:
我的问题是关于如何将数据存储到数据库中以供以后使用。
我们正在考虑以下选项:
a)将PropertyBag属性序列化为XML,并将其与原始对象一起存储到特定字段中。
我们的想法是,这很容易实现,但会给性能增加额外的问题。
b)用户使用一个通用的实体属性值(EAV)表来存储所有对象属性。实体将是原始对象,将属性id赋予属性并为其值赋值。
实施和维护可能很棘手。同样,我们必须将所有属性保留为字符串,以便更好地使用。
c)与(b)相同的方法,但每个对象表有一个EAV表。
实施和维护也很棘手,但表的大小较小。
我们暂时看不到其他选项或替代方案。所以,这是我的问题:
除上述以外,还有其他选择吗?
哪一种最适合这种应用?
任何帮助表示赞赏。
[编辑]
基于评论的更多信息:我认为需要更多上下文才能得出答案。例如:
每个包有多少个值?
其中一些可能有10个或更多(最多20个,最多30个)。它们中的大多数将具有2-5个属性。
我们总共希望有70-100个业务对象。其中一些将具有10.000个或更多的寄存器。几个月后,其中的2或3个将具有1.000.000条记录。
您是否希望能够在数据库中搜索各个值?
我们将永远寻找搜索,但我们的想法是进行两步搜索。首先使用Db级别的“真实” SQL筛选器获取“真实”属性,然后使用linq筛选扩展属性。这是因为搜索纯EAV表会很复杂。
每个客户都具有相同的属性吗?
客户只是一个例子,但是是的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
只有另一种选择是向表中添加其他列。对您来说,这可能是一个非常糟糕的主意,因此我不会理会它。
A.将PropertyBag属性序列化为XML
优点
缺点
B.使用通用实体属性值(EAV)表
优点
缺点
C.每个对象的EAV表
优点
Customer
属性类型分配给Order
对象的情况。缺点
概括
过去,我已经使用了很多选项B,这可能会给您带来极大的痛苦。在不了解您的设置的情况下,我的建议是选择选项C。如果您有足够的资源并且有远见(期望增长,担心表的大小,索引等),那么这将是最佳扩展的选择。现在还值得考虑数据保留策略。例如,您是否有将来需要删除的对象?我还没有找到一个没有的数据库!因此,当您需要删除一堆Customer
对象时,选项B是潜在的性能瓶颈。
最终,虽然只有您知道您的要求,但我希望这会有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句