我的应用程序是在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表会很复杂。
每个客户都有相同的属性吗?
客户只是一个例子,但是是......“扩展属性”对于同一业务类的所有对象都是相同的(例如:客户)。
答案 0 :(得分:1)
只有一个选项是向表中添加其他列。这对你来说可能是个坏主意,所以我不打算讨论它。
:一种。将PropertyBag属性序列化为XML
赞成
缺点
<强> B中。使用公共实体 - 属性 - 值(EAV)表
赞成
缺点
<强>℃。每个对象的EAV表
赞成
Customer
属性类型被分配给Order
个对象,例如。缺点
<强>摘要强>
过去我经常使用选项B,它可能会成为一个真正的痛苦。在不知道你的设置的情况下,我的建议是使用选项C.如果你有资源并且正在思考(期望增长,担心表格大小,索引等等),那么这将是扩展最佳的选择。现在也值得考虑数据保留策略。例如,您将来是否需要删除对象?我还没找到一个没有的数据库!因此,当您需要删除一堆Customer
个对象时,选项B是潜在的性能瓶颈。
最终,只有你知道你的要求,但我希望这会有所帮助。