首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将PropertyBag类存储到数据库中

如何将PropertyBag类存储到数据库中
EN

Stack Overflow用户
提问于 2014-07-01 00:36:01
回答 1查看 2.4K关注 0票数 2

我的应用程序是在C#下构建的,需要动态属性处理。该动态属性由最终用户处理,在我的每个业务对象中添加和删除新字段。

因此,我的方法是在每个对象上构建一个PropertyBag,比如:

代码语言:javascript
复制
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表。

实现和维护都很棘手,但表大小较小。

目前,我们看不到其他的选择或替代方案。所以,我的问题来了:

  1. 除了上面给出的方法之外,还有其他的选择吗?
  2. 哪一个最适合这种应用?

任何帮助都很感激。

编辑

基于评论的更多信息:我认为在得到答案之前需要更多的上下文。例如:

每个袋子会有多少个值?

其中一些人可能有10人或更多人(最多20,30人)。他们中的大多数都会有2-5个属性。

总之,我们预计总共有70-100个业务对象。其中一些将拥有10.000或更多的寄存器。其中2或3个月后将有1.000.000个记录。

您想要在数据库中搜索单个值吗?

我们总是寻找搜索,但我们的想法是做两步搜索。首先,在Db级别上使用"real“SQL过滤器,然后使用linq对扩展属性进行筛选。这是因为搜索一个纯EAV表将非常复杂。

每个客户都有相同的属性吗?

顾客只是一个例子,但是的.对于同一个业务类的所有对象(例如: Customers),“扩展属性”将是相同的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-01 09:05:39

只有一个其他选项,即向表中添加其他列。这对你来说可能是个坏主意,所以我不会费心讨论它。

A.将PropertyBag属性序列化为XML

优点

  1. 易维护
  2. 可以存储任意数量的属性

缺点

  1. 可能会使SQL查询编写起来非常笨拙,而且速度很慢。
  2. 存储在Server中的XML数据类型对于某些ORM软件不起作用
  3. 没有引用完整性(也就是说,没有什么可以阻止您将随机XML放入其中,这会破坏您的软件)

B.使用公共实体-属性值(EAV)表

优点

  1. 你开始得到一些参考的完整性。
  2. 对这些值的查询更容易编写。

缺点

  1. 需要更多的维护。
  2. 所有实体的值都合并成一个表,该表看起来会变得相当大。一个保守的估计,根据你的数字,它看起来你将有1000万的房地产价值在3个月内。对于甲骨文来说,这不是一个问题,但一年后如何?2年后呢?预计的增长?
  3. 所有属性值都是字符串。对于文本和数字来说并不太复杂,但是要小心日期/时间值。
  4. 您可能很难在数据库上强制执行某种完整性。例如,如何停止将属性分配给它不适用的对象?

C. EAV表每个对象

优点

  1. 从备选方案B开始的所有内容。
  2. 引用完整性要好得多,现在不需要担心将Customer属性类型分配给Order对象了。
  3. 最好的数据库性能。
  4. 更易于管理的表大小,特别是如果您期望任何显著增长超过您的3个月的估计。

缺点

  1. 大部分时间都是准备好的。
  2. 还有更多的东西需要维护。

摘要

在过去,我经常使用选项B,这可能会成为一种真正的痛苦。在不了解你的设置的情况下,我的建议是选择C。如果你有资源,并且是前瞻性的思考(期望增长,担心表的大小,索引等等)。然后,这将是最佳的选择。现在也值得考虑数据保留策略。例如,将来会有需要删除的对象吗?我还没有找到一个没有的数据库!因此,当您需要删除一堆Customer对象时,选项B是一个潜在的性能瓶颈。

最终,只有您知道自己的需求,但我希望这会有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24500914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档