存储和使用动态属性

时间:2011-01-28 14:33:58

标签: c# asp.net design-patterns architecture

所以,我正在开发一个电子商务应用程序,我的客户希望能够创建类别和产品......显然。现在,假设客户将拥有大约100个类别和20,000个产品。

客户端需要能够创建对过滤有意义的类别属性....因此,硬盘类别可能具有以下属性:

  • 容量
  • 的RPM
  • 外形尺寸

虽然类别投影仪可能具有以下属性:

  • 亮度
  • 对比度
  • 原生分辨率

我的问题是如何解决允许动态创建自定义属性的问题,但能够使用这些属性进行搜索,过滤和报告?

不可能为每个类别创建单独的表和对象,因为我不知道它们将创建哪些类别(即HardDriveProperties,ProjectorProperties)。

我想也许我可以在数据库中创建一个额外的列并将自定义属性序列化为JSON,但这仍然需要我为每个类别创建一个特定的属性对象以将JSON反序列化为ProductProperties的通用列表....我认为这可能会非常昂贵。

其他人如何解决这个问题?

4 个答案:

答案 0 :(得分:5)

Entity-Attribute-Value model(又名“开放式架构”)是解决此问题的一种方法。

模式的本质是将列组成行。而不是HardDrive(和Projector)表格如下:

HardDrive(HardDriveID, Capacity, RPMs, FormFactor)
------------------    
1 1TB 7200 External

您有CategoryCategoryPropertiesCategoryPropertyValues表:

Category(CategoryID, Description)
--------
1 Hard Drive
2 Projector

CategoryProperties(CategoryPropertyID, CategoryID, Description)
------------------
1 1 Capacity
2 1 RPMs
3 1 FormFactor
4 2 Brightness
5 2 Contrast Ratio
... etc.

CategoryPropertyValues(ItemID, CategoryPropertyID, PropertyValue)
------------------
1 1 1TB
1 2 7200
1 3 External

答案 1 :(得分:0)

创建一个包含ProductID列的表。 创建一个包含以下列的表ProductAttribute:Product(引用ProductID),Name,Value。

我看到的一个网站有几个值列,一个文本和一个数字,以便有效地按范围搜索数值。

答案 2 :(得分:0)

假设您使用关系数据库,我可能会使用类似的内容:

Category(Id, Name)
Property(Id, CategoryId, Description)
Product(Id, CategoryId, Name)
ProductsProperties(Id, ProductId, CategoryId, Value)

这样,您可以在添加/编辑属于特定类别的产品时定义哪些属性可用,并且产品可以具有无限属性。

这比仅序列化JSON值更好,因为搜索/过滤序列化值可能真的很痛苦。但是,这种方法确实使用了相对规范化的数据库结构,因此如果你有很多产品,属性,那么对于全文搜索可能会很慢......

答案 3 :(得分:0)

我认为你的最后一段将是我要去的路线。我主要担心的是大量记录的(de)序列化的表现。