0

让我们这样说吧,我有一个有两种成分的披萨。这些成分存储在我的 PHP 中的一个数组中,在我的 MySQL 中,我将这些数组位置总和的 Int 存储在二进制文件中。

我是说:

$ingredients = ["cheese","pepperoni","bacon","onion"];

如果我的披萨有奶酪和培根,我会存储值 2^0 + 2^2 = 5

我所取得的成就是在我的数据库中搜索所有值为5的比萨饼并获得快速而酷的搜索。

我的问题是:如果我有大量的配料怎么办?即使我只使用其中的 2 个,如果它们位于阵列的较大位置(比如说 100 个),我就完蛋了。

你会在那个特定的问题中使用什么样的解决方案?

PD-显然我不是在谈论披萨公司,我确实关心毫秒速度

4

3 回答 3

6

您最好制作常规的相关表格(pizza, pizza_ingredients, ingredients

这对你甚至 MySQL 来说都会简单得多:

# simple query to find pizza's with specified ingredients
SELECT 
  *
FROM
  pizza_ingredients tpzi
LEFT JOIN
  pizza tp ON
  tp.pizza_ID = tpzi.pizza_ID
WHERE
  tpzi.ingredient_ID IN (1,2,3,45)

表格示例:

pizza

  • 比萨ID,比萨名称

pizza_ingredients':

  • Pizza_ingredient_ID、pizza_ID、成分 ID

桌子ingredients

  • 成分 ID,成分名称

有趣的是..如果您尝试找到带有奶酪的比萨饼:

标准:

SELECT 
  *
FROM
  pizza_ingredients tpzi
LEFT JOIN
  pizza tp ON
  tp.pizza_ID = tpzi.pizza_ID
WHERE
  tpzi.ingredient_ID = 1

你的想法:

SELECT 
  *
FROM
  pizza
WHERE
  pizza_ingerdients MOD = 0

会更慢:)

于 2012-09-01T19:05:39.003 回答
2

在这种情况下,应该在比萨饼和浇头之间实现多对多的关系。

于 2012-09-01T19:00:05.707 回答
1

听起来您在谈论 SET 数据类型。SET 被输入并显示为以逗号分隔的名称列表,但它们在内部存储为整数位图,因此搜索速度很快。

但是,它们仅限于 64 个元素。如果您需要超过 64 列,则可以有多个列:成分 1、成分 2。

于 2012-09-01T19:38:20.640 回答