让我们以这种方式解决问题,我有一种比萨有2种类型的成分。这些成分在我的PHP和我的MySQL中以数组形式存储。我存储这些数组在二进制中的位置之和的Int。
我的意思是:
$ingredients = ["cheese","pepperoni","bacon","onion"];
如果我的披萨有奶酪和培根我会存储值2 ^ 0 + 2 ^ 2 = 5 。
我在数据库中搜索价值 5 的所有比萨饼,并获得快速而酷的搜索。
我的问题是:如果我有很多成分,该怎么办?即使我只使用其中的两个,如果它们位于阵列的较大位置(让我们说100),我就被搞砸了。
您会在该特定问题中使用哪种解决方案?
P.D.-显然我不是在谈论披萨公司,而是关心ms速度
答案 0 :(得分: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
:
表pizza_ingredients
':
表ingredients
有趣的是..如果你想找到奶酪披萨:
标准
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
会慢一些:)
答案 1 :(得分:2)
在这种情况下,人们应该在比萨饼和浇头之间实现多对多的关系。
答案 2 :(得分:1)
听起来你在谈论SET数据类型。 SET被输入并显示为以逗号分隔的名称列表,但它们在内部存储为整数位图,因此搜索速度很快。
但是,它们仅限于64个元素。如果您需要超过64个,则可以有多个列:ingredients1,ingredients2。