【问题标题】:Storing cartesian product results in SQL?在 SQL 中存储笛卡尔积结果?
【发布时间】:2011-09-21 21:37:16
【问题描述】:

感谢阅读,我希望这是有道理的!我正在尝试修改一个定制的 CMS,它提供不同的产品选项,并允许您根据这些选项的组合设置各种属性。这些是从 mySQL 数据库中提取的。例如,一件 T 恤可能有:

Colour         Size       
------         ----
Red            Small
Red            Medium
Blue           Small
Blue           Medium

每种颜色和尺寸都有一个唯一的 ID,因此红色 = 1,蓝色 = 2,小 = 3,中等 = 4。颜色和尺寸都有一个父 ID,所以颜色 = 1,尺寸 = 2。

目前,我正在数据库中的数据库表中存储一个字符串,用于标识每个组合(例如,红色 + 小将是 &1=1&2=3)。然后,该字符串将这种选项组合与各种属性相关联:价格、股票代码等。

但是,当我们想要添加一个新的选项组时,问题就来了,比如袖长。目前,这意味着必须遍历字符串并更改它们以包含新选项。这似乎是一种非常低效且冗长的方法!

所以(最终!)我的问题是 - 有没有更好的方法可以做到这一点?我需要确保对可以添加的选项组的数量没有真正的限制,并允许随时添加新的选项组。

提前感谢您的帮助。

斯图尔特

【问题讨论】:

标签: php mysql sql


【解决方案1】:

我会反问你,你为什么要首先存储它?

笛卡尔积是控制器问题,而不是域模型问题。您的域模型(您的数据库)应该只关心以规范化的方式(或尽可能接近)保持数据,让数据库系统根据需要进行连接(sql 中的inner join),这就是它们的优化首先要做的事情。

【讨论】:

  • 确实如此。保持数据不变,抓取数据时进行 CROSS JOIN。 (@stukerr:撇开 MySQL 中 INNER JOIN 和 CROSS JOIN 可以互换的问题不谈,传统上它是用于显式生成笛卡尔积的 CROSS JOIN,因此这可能会帮助您搜索所需的语法。您可以使用它生成您想要的静态数据表,并按照 Blindy 的建议进行动态操作。)
  • 我认为我需要这个的原因是(有点长!):实际的组(例如颜色)和选项(例如红色)已经存储在数据库的表中,但是我我将此绑定到一个系统,该系统使用单个股票代码来组合期权(例如,红色/小型是股票代码 1001,红色/中型是 1002,蓝色/小型是 1011 等)。我需要单独存储选项,以便它们可以在下拉列表中列出(一个用于颜色,一个用于尺寸等),但我需要一些方法将其与股票代码联系起来,因为它包含价格、数量等信息。 - 我希望这是有道理的!
  • @stukerr,然后考虑合并 ID,例如 comboID = (colorID<<8) | sizeID。我的观点是,这是一个演示问题,而不是数据库支持问题。
猜你喜欢
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多