在这种情况下,设计这个具有 3 个唯一列的简单表的最佳方法是啥?

Posted

技术标签:

【中文标题】在这种情况下,设计这个具有 3 个唯一列的简单表的最佳方法是啥?【英文标题】:What is the optimum way to design this simple table with 3 unique columns in this case?在这种情况下,设计这个具有 3 个唯一列的简单表的最佳方法是什么? 【发布时间】:2013-04-19 05:07:06 【问题描述】:

说,我有一个包含 3 列(varchar 类型)的表,唯一键 = 3 列的组合。 我应该再创建1列(int类型)并为其设置主键,当然我们仍然设置唯一(column1,column2,column3)?

那么哪个更好呢? 3 个唯一列或 4 个列(1 个主键 + 3 个唯一列) 为什么你认为这个选项更好?

【问题讨论】:

【参考方案1】:

额外的伪键列的​​一个优点是更容易为您的表创建 FK,因为您只有一列可以引用

【讨论】:

【参考方案2】:

构建该表有三种合理的方法。基本的关系原则是所有已知的约束必须声明给 dbms,因此 dbms 可以强制执行它们。在所有情况下,包含真实数据的三列可能都必须声明为 NOT NULL。

create table wibble (
  column_1 data-type not null,
  column_2 data-type not null,
  column_3 data-type not null,
  primary key (column_1, column_2, column_3)
);

create table wibble (
  surrogate_id_number integer primary key,
  column_1 data-type not null,
  column_2 data-type not null,
  column_3 data-type not null,
  unique (column_1, column_2, column_3)
);

create table wibble (
  surrogate_id_number integer not null unique,
  column_1 data-type not null,
  column_2 data-type not null,
  column_3 data-type not null,
  primary key (column_1, column_2, column_3)
);

很明显,仅对 ID 号列进行主键约束是不可能的。 将允许这样的重复数据。

1  Value1  Value2  Value3
2  Value1  Value2  Value3
3  Value1  Value2  Value3
4  Value1  Value2  Value3
5  Value1  Value2  Value3

【讨论】:

【参考方案3】:

按照我的说法,您应该将所有列设为主键,因为它永远不允许空值,并且主键索引是表的最有效访问路径。 相反,它取决于您的要求是否需要 int 类型 id。

【讨论】:

以上是关于在这种情况下,设计这个具有 3 个唯一列的简单表的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

我如何将来自 3 个具有唯一 ID 的不同表的结果组合到 mysql 中

具有唯一选择的材料复选框

POSTGRES:如何仅在另一个值不存在时选择具有某个值的行,在这种情况下选择另一个值?

组合 3 个表,其中 2 列的组合不是唯一的

跨多个表的列的 SQL 唯一约束

表结构的设计