【问题标题】:Know the type of relationships between all the tables of database in SQL Server?知道 SQL Server 中所有数据库表之间的关系类型吗?
【发布时间】:2021-01-08 16:59:06
【问题描述】:

我使用来自Know relationships between all the tables of database in SQL Server stackoverflow question 的这个选择来查找我的数据库中存在的所有关系。

SELECT
    fk.name 'FK Name',
    tp.name 'Parent table',
    cp.name, cp.column_id,
    tr.name 'Refrenced table',
    cr.name, cr.column_id
FROM 
    sys.foreign_keys fk
INNER JOIN 
    sys.tables tp ON fk.parent_object_id = tp.object_id
INNER JOIN 
    sys.tables tr ON fk.referenced_object_id = tr.object_id
INNER JOIN 
    sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
INNER JOIN 
    sys.columns cp ON fkc.parent_column_id = cp.column_id AND fkc.parent_object_id = cp.object_id
INNER JOIN 
    sys.columns cr ON fkc.referenced_column_id = cr.column_id AND fkc.referenced_object_id = cr.object_id
ORDER BY
    tp.name, cp.column_id

但是如何将M:MM:11:1 等关系类型添加到结果中?哪个 sql 属性或列这么说?

【问题讨论】:

  • 在任何 2 个表之间不可能有 M:M 关系。要支持这种类型的关系,您必须有第三个表(通常称为交集表)。

标签: sql sql-server


【解决方案1】:

没有 SQL 属性可以跟踪您所请求的内容,因为这些关系只会隐式发生(如果有的话)。

this post 中所述,“技术上不可能”拥有1:1 关系,所以不用担心那个关系。
M:M 不能发生,因为主键必须是唯一的。
M:1 总是存在,其中1 是唯一的主键,M 是外键,因为外键也没有UNIQUE KEY 约束(如果有,则关系为1:0..1,如前面提到的帖子所述)。

我能想到的最接近的内置属性是sys.key_constraints

更新 2021.01.12

澄清一下,虽然1:1 关系不能存在于关系 SQL 数据库中(同样,请参阅 this post 以获得解释),但它们仍然可以逻辑地存在于代码和设计中。

【讨论】:

  • 那么在 typeorm 中他们说 1:1 是如何可能的呢? typeorm.io/#/one-to-one-relations
  • 这是由程序定义的松散的 1:1 关系,而不是由数据库定义。像这样的 ORM 在应用程序端添加约束以强制执行行为(这意味着您仍然可以直接插入 User 并且数据库会接受记录)。
【解决方案2】:

SQL Server 无法知道关系的类型,但这是发现它们的方法:

  1. 1:1 :如果关系在 PRIMARY KEYUNIQUE FOREIGN KEY 之间(唯一索引也可以分开)

所以必须找出 FK 上是否有唯一索引或者它被定义为唯一 fk

  1. 1:M :如果关系在 PRIMARY KEYFOREIGN KEY 之间

因此,如果关系的一侧是该表中的主键,则它是一对多关系。

  1. M:M :如果关系是在非唯一键和非唯一外键之间。

如果不是以上两种类型中的任何一种,则为多对多

【讨论】:

  • 1:1M:M 都不能存在于 SQL Server 中。
猜你喜欢
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 2016-05-26
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多