不要使用“智能钥匙”。
这是一个坏主意,称为“智能钥匙”或“在钥匙中编码信息”。
See 这个答案 https://stackoverflow.com/a/28454136/3404097其中包含这段摘录 https://www.simple-talk.com/sql/learn-sql-server/primary-key-primer-for-sql-server/#sixth:
尽管现在很容易实现智能密钥,但很难建议您创建一个不是自然密钥的自己的智能密钥,因为无论它们有什么优点,它们最终都会遇到麻烦,因为它使数据库变得更加困难进行重构时,会强加一个难以更改的顺序,并且可能不是您的查询的最佳顺序,如果智能键包含非数字字符,则需要进行字符串比较,并且在帮助基于范围的聚合方面不如复合键有效。它还违反了每列都应存储原子值的基本关系准则
智能钥匙也往往会超出其原始编码限制
(请注意,座位位置通常由智能钥匙识别,因为它们是行号和跨行计数。但它们通常也明显物理上永久地固定在该结构中。想象一下,如果它们被贴上标签并重新排列。)
自学数据库设计。
只需用最简单的术语描述您的业务即可。这就是关系模型数据库和 DBMS 的工作原理。
找到足够的填空句子模板来描述您的业务情况:
"customer [cid] has name [firstname] [lastname]
AND customer [cid] has a phone number [phonenumber] of type [type] ..."
"customer [cid] can use credit card #[card_no]"
"seat [seatid] is at row [row] and column [column]"
"seat [seatid] is booked"
"seat [seatid] is temporarily committed to an unfinished booking"
...
对于每个这样的参数化句子模板(又名谓词)有一个基表,其中空白/参数的名称是列名称。表中的每一行都说明了以下语句 (主张)通过填写其列值的空白而获得;不在表中的每一行都声明 NOT 语句根据其列值填充空白。
然后为每个表找到每个功能依赖(FD) 成立。 (当谓词可以用“... AND”的形式表达时column = F(column1,...)”然后我们说列集 {column1,...} 功能上决定 column column然后FD 组 → 柱保持.) 然后识别每个候选键(CK)。 (Asuperkey是在功能上确定每一列的列集。即那是unique,即这些列的值的每个子行仅出现在表的一行中。 CK 是一个不包含更小的超级密钥的超级密钥。)然后找到每个连接依赖(JD)。 (有些谓词对一定数量的 AND 和“...”表示“... AND ...”。当每个谓词“...”的表看起来像只从其列来自原始表。)请注意,每个 FD 都带有一个关联的(二进制)JD。
Then 正常化您的桌子第五范式(5NF)。这意味着分解(即将包含 JD“... AND ...”的表替换为谓词为“...”的表),直到每个包含 JD 的表都是由 CK 暗示 (ie must当来自 FD 和 CK 的 JD 保持时保持。)(出于性能原因,也可以非规范化通过组合到不在 5NF 中的基表。)
See 这个答案 https://stackoverflow.com/a/28124305/3404097 and this one https://stackoverflow.com/a/24425914/3404097.
然后我们通过描述我们想要的行来查询。我们通过使用逻辑运算符(即 AND、OR、NOT、FOR SOME、FOR ALL 等)连接基表谓词和函数调用来为我们想要的表提供谓词和/或通过关系运算符连接基表名称(即 JOIN、UNION、MINUS/EXCEPT、PROJECT/SELECT、RENAME/AS)来给出我们想要的表的值和/或两者(例如 RESTRICT/WHERE)。
两个表的 JOIN 保存由其谓词的 AND 作为谓词的真实语句的行;以及 UNION OR、MINUS/EXCEPT AND NOT;以及该项目/选择columns表的 put FOR SOME所有其他列在其谓词之前;和 RESTRICT/WHERE 放置 AND状况在其谓词之后;和重命名/AScolumn在其谓词中重命名该参数。因此,表表达式对应于谓词:表(基表或查询结果)值包含根据其(基表或查询表达式)谓词生成 true 语句的行。
See 这个答案 https://stackoverflow.com/a/27682724/3404097.
同样适用于限制条件,这些是真实的语句,它们共同描述了给定可能出现的情况和基表谓词可能出现的应用程序情况和数据库状态。
See 这个答案 https://stackoverflow.com/q/24724425/3404097.