sql - 外键列应该是唯一的而不是空的吗?

标签 sql oracle foreign-keys unique notnull

我知道,除非指定,否则外键列可以为 NULL 和重复(至少在 Oracle SQL 中)。将外键列声明为不为空且唯一或保持原样是更好的做法吗?这是应该根据手头的情况做出的决定,还是应该遵循的一般规则?

最佳答案

所有数据库都允许外键为 NULLable 和非 UNIQUE。您选择如何声明特定外键取决于业务案例。

考虑下表,这是一家向 secret 特工销售物资的公司使用的表格。

CountryList (
  CountryCode NOT NULL PRIMARY KEY, 
  CountryName NOT NULL
)
SecretAgents (
  CodeName NOT NULL PRIMARY KEY, 
  HomeCountryCode FOREIGN KEY REFERENCES CountryList(CountryCode)
)

显然,HomeCountryCode 不会是唯一的,因为您可能会在每个国家/地区出售给多个 spy 。它可以为空吗?这取决于您的商业模式是否要求每个客户声明他们的祖国。如果模型允许您与没有祖国的人做生意,或者不想向您透露祖国,那么该字段应该是 NULLable。但是,如果您的业务模型中没有考虑无状态参与者,您应该声明该列为 NOT NULL,这样就不会创建无效的客户记录。

现在,考虑附加表

SpyMasters (
  CountryCode NOT NULL PRIMARY KEY References CountryList(CountryCode),
  Name NOT NULL PRIMARY KEY
)

此表列出了那些拥有 spy 大师的国家的(单例) spy 头目。并非所有国家都会出现在此列表中,但每个国家只能出现一次。在这种情况下,CountryCode 字段是 UNIQUE——但您不必明确声明它,因为 PRIMARY KEY 始终包含唯一性。

关于sql - 外键列应该是唯一的而不是空的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45599275/

相关文章:

java.sql.SQLException : Closed Connection when blob file downloaded in ie8 browser oracle 10g R2 application server

oracle - 只查找两个日期之间的特定日期

mysql - 删除涉及外键的 MySQL 记录而不删除子项

mysql - 错误150使用带有外键的mysql创建表

sql - lib/pq 连接但查询因连接不良而失败

mysql - 使用 LEFT JOIN 优化 JOIN

php - Mysql查询逻辑以及一遍又一遍返回相同变量的循环

sql - ANSI SQL PORTABILITY TO HADOOP HIVE 转换工具或宏

sql - 如何在 Oracle 的间隔分区表中存储 NULL 值?

Grails - 具有级联删除的同一类的多个belongsTo