【问题标题】:Use index or replace values by surrogate ids and add a separate table?使用索引或通过代理 id 替换值并添加单独的表?
【发布时间】:2017-12-28 09:40:45
【问题描述】:

目前我在mysql 中有几个具有这种结构的pivot 表:

user_id |组织ID |输入

4   3   external
4   3   internal
6   4   internal
7   4   external
6   5   external
7   5   external
7   6   internal

如您所见,在我的type 列中,我只使用externalinternal。目前type 列是enum 并已编入索引。

这是一个好的数据库结构还是我应该为type 列创建一个单独的表?

我在几张桌子上遇到了这个“问题”,所以这是一个重要的决定。桌子可能会变得很大。

在这种情况下你会怎么做?

【问题讨论】:

  • “为列类型制作单独的表”是什么意思?请解释/说明。你的意思是,用代理 id 替换类型值并有一个关联 id 和类型值的表?
  • @philipxy 是的,这就是我的意思。
  • 我已经改进了你的标题来说明这一点。请编辑您的问题,cmets 不是为了澄清,它们是短暂的,用于请求和确定要编辑到帖子中的澄清。 PS 你的问题需要清晰、准确和完整。对您所想的(部分)内容的适用但模糊的描述/总结并不能传达您的想法。完整的随附示例也有帮助。

标签: mysql sql normalization database-normalization surrogate-key


【解决方案1】:

这在很大程度上取决于您要针对此表运行的查询类型。

如果您计划运行 忽略 type 列的查询,即不关心它是内部的还是外部的,或者在运行时决定他们想要什么 type 的查询,例如通过用户输入,将所有内容保存在一个表中具有很大的优势。

一般来说,与全表扫描相比,索引选择性较差的列(即在其两个类别中的每个类别中大约有一半的行)只能提供边际性能改进。将表一分为二也是如此:它会使查询变得更加复杂而几乎没有改进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 2021-11-26
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-06
    相关资源
    最近更新 更多