【发布时间】:2014-08-21 11:04:29
【问题描述】:
我的应用程序是在 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 表会很复杂。
每个客户都有相同的属性吗?
Customers 只是一个示例,但是是的...对于同一业务类的所有对象(例如:Customers),“扩展属性”将是相同的。
【问题讨论】:
-
我认为需要更多上下文才能得出答案。例如:每个包有多少个值?您希望能够在数据库中搜索单个值吗?每个客户是否具有相同的属性?
标签: c# sql database oracle architecture