【问题标题】:How to determine cardinality of foreign key using mysql如何使用mysql确定外键的基数
【发布时间】:2012-09-27 09:32:55
【问题描述】:

我遇到了一个问题,我必须使用 mysql 查找表之间关系的基数。关注这篇文章
MySQL: How to determine foreign key relationships programmatically?
我找到了与我的表相关的所有表以及作为外键的列。现在我还想找到关系的基数,即一对一、一对多或多对多。任何想法或 sn-ps 将不胜感激

【问题讨论】:

  • 您真的需要使用相关表计算当前基数吗?基数与可能的值无关,它与当前数据有关。所以,查询应该是:count(distinct values in column)/count(rows in table)
  • 我只是想看看表之间的关系是一对一、一对多还是多对多
  • 如果您在子表中没有找到不代表关系为 1:1 的重复项。与 1:N、M:N 相同。换句话说,您不能确定仅依赖于在子/父表中查找副本的关系类型。您只能找到 M:N 关系,这将是正确的。其他答案就像“可能是 1:1 或 1:N”
  • 是的,但我认为必须有某种方法可以找出答案。如果你使用过 yii 框架,它的 crud 生成器构建了 HAS_MANY、MANY_MANY、HAS_ONE 等关系类型,这意味着有一些方法可以找出答案。
  • 对不起,我不熟悉这个框架。这是伪代码,可以帮助您根据数据查找关系类型。但请注意升级关系类型。这是链接:gist.github.com/3793455。只是一个指导

标签: mysql foreign-keys relationship cardinality


【解决方案1】:

假设表A 有一个外键f,它引用表B 的主键k。然后您可以从架构中学习以下内容:

  • 如果A.f 上存在UNIQUE 约束,则A 中的每一行最多只能有一行B。请注意,在多列索引的情况下,唯一约束的 所有 列必须是外键的一部分。您可以使用SHOW INDEX FROM tablename WHERE Non_unique = 0 获取有关表的唯一性约束的信息。
  • 如果A.f 被声明为NOT NULL,那么A 中的每一行在B 中总会有至少一行。您可以使用SHOW COLUMNS FROM tablename 列出列并查看其中哪些允许NULL 值。

如果你将“一”解释为“零或一”,那么你会得到一个使用唯一约束的一对一关系,以及一个多对一 em> 关系(即A 中的许多行引用B 中的一行)没有这样的唯一约束。

多对多关系将使用单独的表建模,其中每一行代表关系的一个元素,多对一关系用于它包含的两个外键。

【讨论】:

    猜你喜欢
    • 2021-02-05
    • 1970-01-01
    • 2010-09-21
    • 2020-07-10
    • 2011-04-06
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-02-14
    相关资源
    最近更新 更多