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

门德斯

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

实施和维护也很棘手,但表的大小较小。

我们暂时看不到其他选项或替代方案。所以,这是我的问题:

  1. 除上述以外,还有其他选择吗?

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

任何帮助表示赞赏。

[编辑]

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

每个包有多少个值?

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

我们总共希望有70-100个业务对象。其中一些将具有10.000个或更多的寄存器。几个月后,其中的2或3个将具有1.000.000条记录。

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

我们将永远寻找搜索,但我们的想法是进行两步搜索。首先使用Db级别的“真实” SQL筛选器获取“真实”属性,然后使用linq筛选扩展属性。这是因为搜索纯EAV表会很复杂。

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

客户只是一个例子,但是是的。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

戴维

只有另一种选择是向表中添加其他列。对您来说,这可能是一个非常糟糕的主意,因此我不会理会它。

A.将PropertyBag属性序列化为XML

优点

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

缺点

  1. 可能会使SQL查询的编写非常尴尬且速度缓慢。
  2. 对于某些ORM软件,无法在SQL Server中存储XML数据类型内
  3. 没有参照完整性(即没有什么可以阻止您在其中放置会破坏您的软件的随机XML)

B.使用通用实体属性值(EAV)表

优点

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

缺点

  1. 需要更多维护。
  2. 您所有实体的值都合并到一个表中,该表看起来会变得很大。根据您的数字得出的保守估计,您似乎会在3个月内拥有一千万个房地产价值。Oracle可以解决的不是问题,但是1年后又如何呢?2年?预计增长?
  3. 所有属性值都是字符串。对于文本和数字而言,并不太复杂,但请注意日期/时间值。
  4. 您可能很难在数据库上强制某些完整性。例如,如何停止将属性分配给不适用于该对象的对象?

C.每个对象的EAV表

优点

  1. 选项B中的所有内容。
  2. 更好的参照完整性,现在您无需担心将Customer属性类型分配给Order对象的情况。
  3. 最佳的数据库性能。
  4. 表格大小更易于管理,尤其是如果您预计会出现超过3个月估算值的显着增长。

缺点

  1. 最多时间设置。
  2. 还有很多需要维护的。

概括

过去,我已经使用了很多选项B,这可能会给您带来极大的痛苦。在不了解您的设置的情况下,我的建议是选择选项C。如果您有足够的资源并且有远见(期望增长,担心表的大小,索引等),那么这将是最佳扩展的选择。现在还值得考虑数据保留策略。例如,您是否有将来需要删除的对象?我还没有找到一个没有的数据库!因此,当您需要删除一堆Customer对象时,选项B是潜在的性能瓶颈。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将静态类中的数据存储到ASP中的数据库。网?并修改静态类的值?

如何将 MySQL 数据库中的数据存储到由 id 索引的数组中?

如何将动态表中的数据存储到数据库中

如何将图像从模态存储到数据库?

如何将Map <String,LinkedList <Object >>数据存储到数据库表中?

如何将div标记内的数据存储到数据库中?

如何将输入的数据存储到远程数据库中?

如何将表单中的值存储到mySQL数据库中?

如何将MySQL数据库中的值存储到变量中?

如何将数据库中的值存储到集合中?

如何将ICollection值存储到MVC5中的数据库中?

如何将H2数据库文件存储到项目目录中

Laravel如何将数组存储到数据库中

如何将Hibernate Envers审核表存储到其他数据库中?

如何将数据库中存储的多边形绘制到Google地图上

我应该如何将HTML标签存储到数据库中?

如何将数据库记录存储到Rails的哈希红宝石中

Marklogic如何将XQuery文件存储到Modules数据库中

Laravel如何将变量存储到数据库中并在每次单击时更新

如何将选定的头像存储到数据库中

单击创建按钮时,如何将当前时间存储到数据库中?

如何将c#imagesource存储到数据库中?

如何将编码值存储到数据库中

如何将 post api 响应存储到 sqlite 数据库中?

如何将图像存储在数据库中

如何将javascript的值传递到PHP变量中并存储到mysql数据库中?

如何将数据库查询结果中的值存储到机器人框架中的变量中

如何将图像检索到其源存储在SQL Server数据库中的html表中?

如何将具有getter / setter的TypeScript类实例转换为JSON以存储在MySQL数据库中