我遇到问题,数据库管理员有以下结构:
正如您所看到的,表TCModulo
的主键是ID_modulo
和ID_sistema
的组合键,它是表TCSistemas
的外键。< / p>
我认为表ID_modulo
中的字段TCModulo
必须是具有auto_increment约束的主键,而字段ID_sistema
必须只是外键。
哪一个更好?
答案 0 :(得分:1)
TCmodulo的PK是(ID_modulo)还是(ID_modulo,ID_sistema)取决于表中的内容。除非您告诉我们,否则我们无法回答您的问题。假设行中的ID_modulo值是您引用某些模数的方式。你必须告诉我们如何做到这一点。但在此之后(对于每一列)(并且考虑到可能出现的情况),关于哪些列是主键的候选列,没有任何选择。
一组列的子行值在表中是唯一的,称为超级键。包含唯一子行的任何子行都是唯一的。因此,包含超级密钥的任何列都是超级密钥。不包含(较小)唯一子行的子行称为候选键。因此,不包含(较小)超级密钥的超级密钥是候选密钥。选择表的一个候选键作为主键。
如果ID_modulo在整个应用程序中唯一地确定了一个模块,那么(ID_modulo)将是唯一的,其中没有更小的唯一子内部,因此它将是候选键。它将是唯一的一个,因此它将成为主键。
如果ID_modulo仅根据sistema唯一确定模块,则(ID_modulo,ID_sistema)将是唯一的,没有更小的唯一子行(假设可以有多个sistemo),因此它将是候选键。它将是唯一的一个,因此它将成为主键。
因此,可以选择哪些候选键作为主键取决于您的应用程序如何引用模数。之后,没有关于候选键的选择。在这两种情况中,每种情况只有一个候选键,因此也无法选择主键。
至于您是否应该在整体上或仅在sistema内或两者或其他任何内容中具有唯一ID,这取决于其他人体工程学问题。例如,你在stackoverflow中是唯一的kentverger(现在;用户名不一定是唯一的),但也许是家中唯一的肯特。例如,您可能更喜欢今天打电话给7月4日而不是185天。但请注意,任何候选键都是唯一的标识符。因此,如果ID_modulo仅在sistema中是唯一的,那么仍然(ID_modula,ID_sistema)是唯一的。
请注意,这与模数本身与sistemas多对一无关。它与形成独特子行的列有关。
答案 1 :(得分:-2)
我总是更喜欢使用主键的身份(自动增量),因为它可以更好地保持页面集群并避免磁盘碎片化。无论如何你需要一个外键ID_sistema,所以也加上它。