【问题标题】:Storing And Working With Dynamic Properties存储和使用动态属性
【发布时间】:2011-06-17 07:01:23
【问题描述】:

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

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

  • 容量
  • RPM
  • 外形尺寸

虽然 Projectors 类别可能具有以下属性:

  • 亮度
  • 对比度
  • 本机分辨率

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    创建具有列 ProductID 的表 Product。 创建一个包含以下列的表 ProductAttribute:产品(引用的 ProductID)、名称、值。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        【解决方案3】:

        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
        

        【讨论】:

          【解决方案4】:

          我认为您的最后一段将是我要走的路线。我主要关心的是大量记录的(反)序列化性能。

          【讨论】:

            猜你喜欢
            • 2012-06-07
            • 2018-01-31
            • 2021-05-13
            • 2013-10-09
            • 1970-01-01
            • 1970-01-01
            • 2014-02-20
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多