时间:2018-06-01 11:01:33

标签: sql postgresql database-design

我正在编写一个脚本,在将数据插入表之前检查唯一约束冲突。

忽略主键,有哪些变化?

  1. 表格中只有一个唯一字段
  2. 中存在多个唯一字段
  3. 存在唯一字段,即复合(字段的唯一组合)
  4. (1或2)与3
  5. 的组合

    2号变异是否有意义?它是在实践中使用还是被认为是糟糕的设计?

2 个答案:

答案 0 :(得分:2)

根据您的商业模式,只是为了补充所有其他评论,是的,所有这些变体都是可行的和推荐的。商业模式驱动所有约束。以下面的例子为例:

create table employee (
  id int primary key not null,
  name varchar(50) not null,
  ssn varchar(10) not null,
  branch_id int not null,
  in_branch_serial int not null,
  constraint uq_name unique (name),
  constraint uq_ssn unique (ssn),
  constraint uq_employee_number unique (branch_id, in_branch_serial)
);

此表格包含:

  • id是唯一的,因为它是主键。
  • name也是独一无二的,我们决定这样做。
  • 根据我们的商业模式,ssn也是独一无二的。
  • branch_id + in_branch_serial组合是唯一的。同一分支上的员工将具有相同的branch_id,但两列的组合将是唯一的。

答案 1 :(得分:2)

您的问题中缺少的字词是KEY。表可以有零个,一个或多个键。在关系数据库中,表必须至少有一个密钥,但SQL DBMS允许没有密钥的表。

任何键都可以包含零个,一个或多个属性。键有时可以重叠 - 意味着一个键中的属性也是另一个键中的属性,尽管这是相对不寻常的。

键也可能没有属性。单例表就是这种情况 - 约束为(最多)一行的表。 Oracle中的DUAL系统表是一个众所周知的例子。遗憾的是,SQL不支持“空”键语法,但有一些解决方法用于实现相同的效果。

通常会针对已知的密钥检查数据。除非您的数据真的永远不会改变,否则从数据中导出密钥通常不是一项有用的练习。如果一个表只有10个(不可为空)属性,那么1024个可能的超级密钥中最多可能有252个密钥,因此检查所有可能性是一个相当困难的问题。