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

时间:2014-07-01 00:36:01

标签: c# sql database oracle architecture

我的应用程序是在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 Article

我的问题是关于如何将数据存储到数据库中供以后使用。

我们正在考虑以下选项:

a)将PropertyBag属性序列化为XML并与原始对象一起存储到特定字段中。

我们的想法是,这很容易实现,但可能会给性能增加额外的问题。

b)用户使用公共实体 - 属性 - 值(EAV)表来存储所有对象属性。实体将是原始对象,属性属性id并赋值其值。

实施和维护可能很棘手。此外,我们必须将所有属性保留为字符串以便更好地使用。

c)与(b)相同的方法,但每个对象表都有一个EAV表。

实施和维护也很棘手,但桌面尺寸较小。

我们现在看不到其他选择或替代方案。所以,这是我的问题:

  1. 上面给出的还有其他替代方案吗?

  2. 哪一个最适合这种应用?

  3. 任何帮助表示感谢。

    [编辑]

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

    每个包有多少个值?

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

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

    您是否希望能够在数据库中搜索单个值?

    我们总是期待搜索,但我们的想法是进行两步搜索。首先使用“实际”属性在Db级别上使用“真实”SQL过滤器,然后使用linq过滤扩展属性。这是因为搜索纯EAV表会很复杂。

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

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

1 个答案:

答案 0 :(得分:1)

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

:一种。将PropertyBag属性序列化为XML

赞成

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

    1. 可能使SQL查询编写起来很慢并且速度慢。
    2. 在SQL Server中存储XML数据类型不适用于某些ORM软件
    3. 没有参照完整性(即没有什么可以阻止你将随机XML放在那里会破坏你的软件)
    4. <强> B中。使用公共实体 - 属性 - 值(EAV)表

      赞成

      1. 您开始获得一些参照完整性。
      2. 对值的查询更容易编写。
      3. 缺点

        1. 需要更多维护。
        2. 所有实体的值都合并为一个表,看起来会变得相当大。保守估计基于您的数字,看起来您将在3个月内拥有1000万个房产价值。对Oracle来说不是一个问题,但1年后怎么样? 2年?预计增长?
        3. 所有属性值都是字符串。对于文本和数字而言并不复杂,但要注意日期/时间值。
        4. 您可能很难在数据库上强制执行某些完整性。例如,如何停止将属性分配给它不适用的对象?
        5. <强>℃。每个对象的EAV表

          赞成

          1. 选项B的所有内容。
          2. 更好的参照完整性,现在您不必担心Customer属性类型被分配给Order个对象,例如。
          3. 最佳数据库性能。
          4. 更易于管理的表格大小,特别是如果您预计会有超过3个月估算值的显着增长。
          5. 缺点

            1. 大部分时间设置。
            2. 维护更多。
            3. <强>摘要

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

              最终,只有你知道你的要求,但我希望这会有所帮助。