gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 20:40:01 24 4
gpt4 key购买 nike

我的应用程序是在 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. 哪一个最适合这种应用程序?

感谢任何帮助。

[编辑]

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

每个袋子有多少值(value)?

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

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

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

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

每个客户是否具有相同的属性?

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

最佳答案

只有一种选择是向您的表中添加额外的列。这对你来说可能是一个非常糟糕的主意,所以我不会费心讨论它。

A.将 PropertyBag 属性序列化为 XML

优点

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

缺点

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

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

优点

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

缺点

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

C.每个对象的 EAV 表

优点

  1. 选项 B 中的所有内容。
  2. 更好的参照完整性,例如,现在您无需担心 Customer 属性类型被分配给 Order 对象。
  3. 最好的数据库性能。
  4. 更易于管理的 table 大小,特别是如果您预计任何显着增长超过您 3 个月的估计。

缺点

  1. 大部分时间用于设置。
  2. 还有很多需要维护。

总结

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

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

关于c# - 如何将 PropertyBag 类存储到数据库中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24500914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com