我正在一个Web项目中,用户应该能够创建自定义类型的商品,其中包含任意数量的不同类型的属性(数字,文本等)。例如:一个具有名称,价格和外形尺寸的盒子,以及一个具有名称,价格和体积的瓶子。
在代码和数据库中代表这一点的最佳方法是什么?我的第一个想法是为一件商品创建一个基本模板,并将所有自定义数据作为字符串化的JSON转储到单个字段中。不利的一面是该数据无法用于IQueryable搜索,过滤和排序。
我还可以考虑创建一个单独的表,在其中存储所有商品的所有自定义字段,并通过关系引用它们。但是,这是否会导致缩放问题,因为我实际上将所有自定义属性存储在单个表中的所有位置。
是最好的方式吗?当然,无法在.NET Core中即时创建新的类和数据库表,但是还有哪些其他选项?
谢谢您的时间,
我在当前的副项目中正在执行此操作,并且过去也已执行过。基本上,您将有一个基本的Product
表(或任何您想命名的表)。然后,您还有诸如ProductAttributeType
和ProductAttribute
之类的表。
基本Product
表将包含所有产品共有的属性,例如Name
和Price
。
ProductAttributeType
ProductAttributeTypeCode VARCHAR(10)
AttributeTypeName VARCHAR(50)
[ProductAttributeTypeCode
包含属性类型的短/缩写代码(例如“ BOOL”,并且AttributeTypeName
是友好名称(例如“ Boolean”或“ Yes / No”)。]]
ProductAttribute
ProductId INT -- Foreign key to Product table ProductAttributeTypeCode VARCHAR(10) -- Foreign key to ProductAttributeType table AttributeName VARCHAR(100) -- The name of the product attribute (e.g. "Volume") AttributeValue VARCHAR(MAX) -- Contains the actual value of the product attribute
[
Product
与ProductAttribute
具有一对多关系。
这是我过去以及当前项目中采用的方法,并且效果很好。这似乎是解决此类问题的一种非常普遍的方法。我能想到的唯一“缺点”是您需要确保ProductAttribute.AttributeValue
列中的值与ProductAttributeType(Code)
的适当类型匹配。如果您正确地设计代码,并且经过深思熟虑,我认为它的确还不错。