MySQL:我应该在哪里放置外键?

时间:2015-01-14 08:38:22

标签: mysql sql database-design foreign-keys relational-database

我怀疑。请仔细阅读以下示例。

  1. 有一种名为其他收入
  2. 的收入类型
  3. 每一项其他收入五月或五月不会受到增值税
  4. 一个其他收入只有一个增值税,如果有的话。
  5. 正如您在上述几点所述,其他收入增值税之间的关系为一对一/无

    现在看下图。

    enter image description here

    我们希望VAT表格包含 Other_Income 引用,因此idVat位于 Other_Income 表中。如果您想知道为什么有一个单独的增值税表,这是因为许多其他类型的费用也要缴纳增值税。

    但是,想象一下,由于某种原因,有人希望 Other_Income 表格包含增值税参考。在这种情况下,如果您使用 MySQL Work bench 或GUI工具来构建图表,关系行中的1将显示在Other_Income表的一侧,并且0..1将显示在VAT表格旁边。

    但是,无论它是什么,它都具有连接一对一/无。那么,Relationship和外键的位置之间没有联系?换句话说,没有类似You must put the foreign key to X table of the relationship. Other table is prohibited.的规则?

    据我所知,并且知道没有这样的规则,你可以将外键放在关系中的任何表中,这只是你的偏好和决定使事情“起作用”。不过我想澄清我的怀疑。

    更新

    以上只是一个更有意义的解释问题的例子。因此,请不要让你的答案取决于上面的“确切”。

4 个答案:

答案 0 :(得分:1)

外键可以为null。在某些情况下,您只是不知道密钥的值是什么。 您可以查看此link

外键的关系和位置之间存在链接。如果只是将外键的值放在未定义外键的表中,那么它只是一个正常值,没有键提供的所有好处。

答案 1 :(得分:0)

当引用表中的列中的值始终出现在引用表的列中并且引用的列在引用的表中是唯一的时,引用另一个表列的一个表列中有一个外键(FK)。 (它在那里被声明为UNIQUE NOT NULL或PRIMARY KEY。)此外,在SQL中,引用列可以为NULL。

由于引用的列在引用的表中是唯一的,因此引用表中的行要么IS NOT NULL,要么只匹配引用表中的一行或IS NULL。引用表中的许多行可能引用引用表中的同一行。但引用表中的某些行可能不会被引用表中的任何行引用。因此,NOT NULL引用行转到1个引用行,可引用行转到0或1引用行。并且一行由0或多个引用行引用。因此,外键意味着0或多对(0或 - )1的情况。

你的1/2/3只是说从Other_Income到增值税有一个可以为空的FK。即0或多数到0或-1。这并不能证明拥有1而不是许多,并且没有理由将FK从VAT增加到Other_Income。也就是说1/2/3意味着"其他收入和增值税之间的关系是一对一/无关"。

如果碰巧有其他限制,那么你还没有这么说。例如,增值税中的FK引用了Other_Income。在这种特殊情况下,每个Other_Income都有自己的增值税(如果有的话)。 (并且还必须是增值税有其自己的Other_Income,如果它有一个。)但是在这种情况下,如果增值税总是具有匹配的Other_Income,我们有Other_Income-VAT 1:0-or-1,如果增值税没有& #39; t总是有一个Other_Income,因此可以为空,那么我们有Other_Income-VAT 0-or-1:0-or-1。 (我现在使用":"因为在两个方向都有"到"。

你唯一一次选择放置FK的地方就是当你有1:1然后你留下一个FK。具有讽刺意味的是,在1:1的情况下,您可以将所有信息放入一个没有FK的表中,这是对称和非冗余设计而不是两个表。在0-or-1:0-or-1情况下,如果我们想避免使用NULL,那么我们在任一个表中都没有FK并添加第三个表,其中两列是FK,每个都是PK,枚举配对值。

答案 2 :(得分:0)

其他收入可以含增值税。因此必须为该表提供列idVAT。对于每条记录,都会有一个条目或NULL。

所以你有{0-n}:{0-1}的关系。每个增值税("降低的费率","正常费率"等)可以分配给n个其他收入(n为零或任何数字)。每个其他收入可以有0或1个增值税。

为了不能在其他收入中输入不存在的idVAT,您可以将其作为VAT表的外键。

如果您希望两个表之间存在真正的{1}:{0:1}关系,例如增值税表并不包含增值税水平("降低税率","正常税率"等),但是一定数量的金钱,然后事情变得稍微复杂一些。

通常,您不会创建这两个表,但只有一个(增值税金额将是其他收入中可以为空的列)。如果您确实需要两个表,那么您将为增值税表提供idOther_Income,因为每个增值税条目都指一个其他收入。所以这次反之亦然,但你仍然会使用外键来确保数据的完整性。当然,这次是从增值税到其他收入。您还要给VAT.idOther_Income一个唯一约束,因此每个其他收入只能有一个增值税。

答案 3 :(得分:0)

我希望我能正确理解你的问题 它接缝你有不同的费用表(如其他收入......)。费用表中的任何一行都可能有增值税记录。

条件是:

  • 如果没有费用,将不会发生增值税(如果我错了,请纠正我。)
  • 费用需要跟踪增值税(如果发生)。
  • 增值税需要记录其费用(必须发生)。
  • 费用只能有一个增值税。

我建议将一个名为Fee_Base(或简称费用)的基表作为其他费用的基础。该基表将包含其他费用的共享属性,如发生日期,金额等 让VAT_Base外键在增值税内强制将满足1,2和3条件 分配费用为唯一的Fee_Base外键将满足4号。

enter image description here Simply Fee_Base foreign是VAT表的主要关键。 enter image description here

相关问题