数据库
首页 > 数据库> > sql – 使用大量不同的必需信息对产品进行建模并将它们链接到lineitems?

sql – 使用大量不同的必需信息对产品进行建模并将它们链接到lineitems?

作者:互联网

我目前正在开发一个销售各种定制产品的网站.我有一般的标准购物车架构:订单有很多LineItems,LineItems有一个产品,但我遇到了一个棘手的问题:

让我们说我们的产品之一是一个球,我们的产品之一是一盒蜡笔.当人们创建他们的订单时,我们最终会创建可以用一些伪代码表示的项目:

Ball:
  attributes:
     diameter: decimal
     color: foreign_ref_to Colors.id
     material: foreign_ref to Materials.id
CrayonBox:
  attributes:
     width: decimal
     height: decimal
     front_text: string
     crayons: many_to_many with Crayon
...

现在,这些是在订单生成之前创建并存储在我们的数据库中的.我可以很容易地做到这一点,当一个项目被添加到购物车时,我们通过在我的控制器中从Ball或CrayonBox进行链接并生成LineItem来获得产品名称和价格,但如果我们能够提供每个订单项的完整信息集.

我想到了一些可能的解决方案,但没有一个看起来很理想:

一:使用中间“产品信息”链接表,并代表不同的产品,所以我们有类似的东西:

LineItem
  information: many_to_many with product_information
  ...
ProductInformation:
  lineitem: many_to_many with line_item
  name: string
  value: string

ProductInformation(name='color', value=$SOMECOLOR)
ProductInformation(name='color', value=$SOMEOTHERCOLOR)
...

这样做的问题是,需要为产品的每个属性表示的数据类型并不都属于同一列类型.我可以用字符串表示所有内容,但是$DEITY知道我甚至不认为这是一个很好的解决方案.

我想到的另一个解决方案是使LineItem表具有表示Product类型的每个表的外键.不幸的是,这意味着我必须检查控制器中是否存在每个外键.我根本不喜欢这个,但我喜欢它比将每个数据填充到一个数据类型然后处理数据库之外的所有转换内容更好.

另一种可能的解决方案是将产品数据的表名存储在一列中,但这可能不是一件好事,可以吗?我失去了db将各种东西链接在一起的能力,这让我感觉像是在不需要它的情况下使用eval()而且我们都知道eval()并不是经常需要的.

我希望能够说“给我订单项,然后是该订单项的扩展信息”,并为各种产品类型提供正确的信息集.

那么,实际上知道他们在使用数据库模式做什么的人,我该怎么办?我该怎么代表这个?这似乎是一个相当常见的用例,但我无法通过谷歌搜索找到太多信息 – 这样的事情有一个共同的模式吗?需要更多信息?这不可能超出“你可以使用RDBMS”的范围,是吗?

编辑:我现在相当确定我想要的是Class Table Inheritance.在我的个人模型中使用别名来“规范化”每个产品类型的“信息”表后面的链接.不幸的是,ORM我有点被用于此(Doctrine 1.2)不支持类表继承.我可能能够用Doctrine的“列聚合”继承来完成类似的东西,但是egh.有谁觉得我在错误的树上吠叫?我查看了EAV,我不认为它非常适合这个问题 – 关于不同产品的每组信息都是已知的,尽管它们可能与产品类型A到产品类型B非常不同.EAV的灵活性可能很好,但似乎是像这样的问题滥用数据库.

解决方法:

令我感到震惊的是,这非常适合CouchDB/MongoDB,它允许每个’行’包含不同的属性,但允许索引查找.使用MySQL为刚性关系部分构建混合结构应该相当简单,对于不同形状的部分使用’nosql’构建混合结构应该相当简单.

标签:mysql,database,sql,database-design,data-modeling
来源: https://codeday.me/bug/20190710/1422059.html