Asc*_*ant 5 database-design primary-key architecture
我在一家随机公司担任“访客”开发人员。
我正在处理一个根据定义(Oracle)没有主键的表。
名为“SOMETHING_ID”的列是 varchar2(10) 并在插入时通过以下操作构造。它用作主键并被其他表引用。
'A_STRING' || LPAD(SEQUENCE_NAME.NEXTVAL, 7, '0')
Run Code Online (Sandbox Code Playgroud)
主键数据的一些示例是
CH-00004321
CH-00004322
CH-00004323
Run Code Online (Sandbox Code Playgroud)
我的问题是,
首先,在什么情况下使用由记录类型(比方说,CH 表示中国菜,In 表示印度菜,MX 表示墨西哥菜)和序列号的组合的主键是合理的?
其次,在什么情况下不定义主键但您有一个明确区分每一行的列是合理的?
第三,我的看法是否正确,我看到类型字符串(CH、IN、MX)和序列号的组合违反了第一规范化?
第四,在表中,只有一个“类型字符串”值(假设是 CH)。是否可以将该字符串添加到 pk 而它似乎没有必要,因为只有一个值?(尽管与我的食物示例不同,表格的性质似乎不允许类型字符串的任何其他值。也许您可以将表格名称视为“CHINESE_FOOD”,因此没有其他类型的字符串值似乎合乎逻辑。)
注 - 1. 实际列、序列名称替换为任意名称。
2. 本软件的目的是预测自然灾害造成的损失。
在什么情况下使用由记录类型(比方说,CH 表示中国菜,In 表示印度菜,MX 表示墨西哥菜)和序列号的组合的主键是合理的?
在任何情况下,这都是合理的。包含两个不同数据元素作为一个值的列违反了第一范式。除其他外,1NF 要求每列包含一个值。这种做法还破坏保证的逻辑访问每个数据元素按表名、列名和键值。现在,如果每个数据元素都在它自己的列中,并且列的组合构成一个键,那不是问题。最终,这取决于表保存实体出现的实体类型。选择的密钥应该是现实世界中人们用来识别事件的东西。如果我们谈论的是菜单,并且菜单中有一个中餐部分,然后给每道菜一个编号,例如 #1、#2 等,这也许是有道理的。
其次,在什么情况下不定义主键但您有一个明确区分每一行的列是合理的?
再次,在任何情况下。如果存在其值唯一标识每一行的列,则必须将该列声明为唯一约束,以确保输入的事件不会重复,从而与它们所代表的现实世界实体不一致。
第三,我的看法是否正确,我看到类型字符串(CH、IN、MX)和序列号的组合违反了第一规范化?
当然,如上所述。
第四,在表中,只有一个“类型字符串”值(假设是 CH)。是否可以将该字符串添加到 pk 而它似乎没有必要,因为只有一个值?
不,出于同样的原因,这违反了 1NF。同样,该列包含 2 个不同的值,并且每列必须仅包含一个值才能在 1NF 中。
Fabian Pascal 的实用数据库基础系列是深入研究这些基础知识的重要参考资料。论文 #4 专门解决了关键问题。