我的应用程序是在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类基于本文:
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级别上使用"real“SQL过滤器,然后使用linq对扩展属性进行筛选。这是因为搜索一个纯EAV表将非常复杂。
每个客户都有相同的属性吗?
顾客只是一个例子,但是的.对于同一个业务类的所有对象(例如: Customers),“扩展属性”将是相同的。
发布于 2014-07-01 09:05:39
只有一个其他选项,即向表中添加其他列。这对你来说可能是个坏主意,所以我不会费心讨论它。
A.将PropertyBag属性序列化为XML
优点
缺点
B.使用公共实体-属性值(EAV)表
优点
缺点
C. EAV表每个对象
优点
Customer属性类型分配给Order对象了。缺点
摘要
在过去,我经常使用选项B,这可能会成为一种真正的痛苦。在不了解你的设置的情况下,我的建议是选择C。如果你有资源,并且是前瞻性的思考(期望增长,担心表的大小,索引等等)。然后,这将是最佳的选择。现在也值得考虑数据保留策略。例如,将来会有需要删除的对象吗?我还没有找到一个没有的数据库!因此,当您需要删除一堆Customer对象时,选项B是一个潜在的性能瓶颈。
最终,只有您知道自己的需求,但我希望这会有所帮助。
https://stackoverflow.com/questions/24500914
复制相似问题