【问题标题】:MySQL Field bigger than bigintMySQL 字段大于 bigint
【发布时间】:2012-08-27 03:57:31
【问题描述】:

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

我的意思是:

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

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

我实现的目标是在我的数据库中搜索所有价值 5 的比萨饼,并获得快速而酷炫的搜索。

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

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

P.D.- 显然我不是在谈论披萨公司,我确实关心 ms 速度

【问题讨论】:

  • Please read this article。你最好在为时已晚之前制作常规的相关表格(pizza,pizza_ingredients,ingredients):)
  • 你不能要双份奶酪吗?
  • 当然,这就是我实际使用的解决方案,但我真的很喜欢我解释过的那种按价值搜索。对于少数值来说,这是一个很好的解决方案,但我想知道它们何时大量使用:-/
  • 没有 Álvaro,你不能(它完全修复了我的结构):-)
  • -1 您正在寻求帮助以用锤子拧螺丝,但您拒绝了螺丝刀的好意。我确定您不会听,但我希望此评论能对遇到您的问题并可能认为这是一个“好主意”的其他人提出警告。

标签: php mysql sql database architecture


【解决方案1】:

您最好制作常规的相关表格 (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_ID,pizza_name

pizza_ingredients':

  • pizza_ingredient_ID、pizza_ID、成份ID

ingredients

  • ingredient_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

会慢一些:)

【讨论】:

  • 谢谢彼得,这很合适,但我的问题不是寻找那种标准的解决方案,我正在寻找那种明智的解决方案
  • @JoseVillalobos 这是标准解决方案,因为它是明智的解决方案。您最好在某些 C 代码中使用位运算符,而不是 SQL
  • @Jose 再次检查我的答案。在许多情况下,除了“查找特定的披萨”之外,您的想法会变慢
  • 感谢您的回答,这就是我实际处理它的方式,但我正在寻找某种按位运算。我会保持这种方式,但会继续寻找另一种解决方案,但无论如何,按位解决方案将在 MySQL 上停留在 64 位
【解决方案2】:

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

【讨论】:

  • 我知道,但后来我失去了问题的那一部分:“我所取得的成就是在我的数据库中搜索所有值为 5 的比萨饼并获得快速而酷的搜索。”跨度>
  • @JoseVillalobos 如果您为披萨公司做网站,您是否关心 ms 速度?
  • 这是可维护性和易于编码之间的选择——我更喜欢前者。 @Peter 描述了一种按照您说的做的好方法,但不会混淆位操作符。
【解决方案3】:

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

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

【讨论】:

  • +1 但是删除这个出色的答案是对互联网的帮助;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 2012-12-28
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
相关资源
最近更新 更多