在这种情况下,设计这个具有 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 中