【问题标题】:SELECT DISTINCT or separate normalized table?SELECT DISTINCT 还是单独的规范化表?
【发布时间】:2012-06-01 11:14:32
【问题描述】:

我们现在正在制定计划,所以在开始推进之前,我想确保我以最好的方式处理事情。

我们有一个产品表,我们将在其中添加一个名为“格式”的新字段,该字段将是产品的结构(袋子、盒子等)。这没有设置值,用户可以在该字段中输入他们喜欢的任何内容,但是我们希望显示用户已经输入的所有格式的下拉列表。

我可以想到两种方法来做到这一点:要么在 products 表上使用基本的 SELECT DISTINCT 来获取用户已经填写的所有格式;要么或存储格式并由产品链接到的单独表。

本能地我想使用 SELECT DISTINCT,因为它会让我的生活更轻松。但是,假设一张表包含十亿种产品,那么最好的方法是什么?

【问题讨论】:

  • 在 90% 的情况下使用 DISTINCT 意味着您做错了什么。我并不是说它没用,但它是错误查询或架构的完美指标

标签: php mysql sql normalization


【解决方案1】:

如果您决定将所有内容保存在一个表中,请在该列上建立索引。这应该会加快在用户应用程序中创建列表的处理速度。

我有点不知道哪种方法是最好的。通常,在设计用户界面时,您想尝试不同的东西。必须进行数据库更改会阻碍构建应用程序的创造性过程。

另一方面,通常当用户从应用程序的下拉框中选择事物时,这些“事物”是“实体”的极好示例,而这正是表要存储的内容。

最后,我想说的是在开发应用程序时做最方便的事情。当您接近完成时,考虑将这些内容存储在单独的表中是否更好。最大的问题之一是您是否想知道所有已经使用过的格式,即使目前没有用户定义它们。

【讨论】:

  • 很好的答案,和我想的差不多。我认为将格式存储在单独的表中将是“更正确”的方法,但好处似乎并不值得额外的工作。最后我选择了 DISTINCT。谢谢!
【解决方案2】:

我想我会选择第二个选项(如果你想添加约束,附加表 + 外键),只是因为体积,并且因为你可以拥有合并类似产品形式的管理。

【讨论】:

    【解决方案3】:

    由于您让用户输入他们想要的任何内容,我会选择第二个选项。

    创建一个新表并在其中插入所有新的“格式”并链接到产品表。

    确保在创建代码以添加用户输入的格式时,检查数据库中是否存在相等的值,这样您就不需要区分它们。

    另外,保持一致,或者每个单词的第一个字母大写。

    【讨论】:

      猜你喜欢
      • 2014-10-02
      • 2011-02-21
      • 1970-01-01
      • 2011-04-11
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      • 2019-05-14
      相关资源
      最近更新 更多