我的数据库中有几个表,其中包含链接到另一个表的外键字段。问题是,该字段的值并不总是存在,因此有时我可能不得不插入一个空外键字段。详细说明:
我有一张表Sense_LanguageSource
,其中列出了字典中条目的各个词源。这具有以下字段:
- LanguageSourceID(PK - 自动编号)
- SenseFK(FK - 编号)
- 语言代码(FK - 数字)
- SourceWord(短文本)
- LanguageSourceType(短文本)
- IsWaseieigo(是/否)
该LanguageCode
领域是有问题的情况。它用于列出词源源自的语言,在这种情况下,它是链接到LanguageCodeValue
表的外键,其中包含 ISO-639-2B 代码和语言的全名。
但是,我要插入数据库的一些词源没有语言代码,所以我必须在该字段中插入一个 0。最初,Access 不允许我这样做,所以我禁用了参照完整性。然后当我重新打开数据库时,Access 说数据库被入侵,需要修复。所以我认为我需要一个替代解决方案。
我会使其不那么标准化,并在其中简单地有一个 LanguageCode 的文本字段,但是有两个表引用该LanguageCodeValue
表,并且有一个表来描述每个 LanguageCode 所指的内容似乎很有意义。我现在能想到的解决方案是:
LanguageCode
删除字段和表之间的关系LanguageCodeValue
(使其纯粹是参考表,而不是链接),SELECT
如果我需要查找 LanguageCode 的含义,只需使用查询。在没有参照完整性的情况下保持表之间的链接以允许空外键,并希望数据库不会崩溃。
在要引用的表中插入一个“null”值
LanguageCodeValue
(我的意思是键值为 0 或类似值的实际记录,文本字段为空白值),以便输入空外键,而不是输入空外键,我可以链接到一个没有任何意义的记录。另一个解决方案?
由于我是数据库新手并且不确定最佳设计实践,我想知道哪种解决方案最适合我的情况。
正如 Akina 在评论中所说,尽量避免破坏数据库中的关系和参照完整性。如果有文件证明需要在其中有一个值来指示“无”、“未知”、“其他”或类似的东西,最好将它放在查找表中,而不是尝试将 Access 分开以允许 NULL在外键字段中。
保持引用完整性。选项#3 是您最好的选择。但是,不要在 LanguageCodeValue 中插入空值,而是创建一个键为 -1 且值为“未知”的新记录。任何使用空 LanguageCode 外键插入 Sense_LanguageSource 的记录都应使用 -1 作为键。因此,任何连接都会将 LanguageCode 值显示为“未知”。