database - 在方向无关的自反多对多关系中避免重复

标签 database relational-database

给定一个表 users( #user_id ) 和一个表 user_related( #related_user1, #related_user2 )其中只有两个用户之间关系的存在是相关的,因此如果 user_related 中存在作为 (1, 2) 的行,则 (2, 1) 行将是多余的:

  • 从理论上而非实际的方式思考:是否有可能以一种不需要约束或检查的方式来实现这种关系?当交换 ID 的关系已经存在时,试图在两个用户之间插入关系会违反数据完整性吗?

  • 实用:实现和查询所述关系的最佳方式是什么?

最佳答案

简单。但首先,要澄清您的一些误解。

Thinking in a theoretical, non practical way: is it possible to implement this kind of relationship in a way that no constraint nor check is needed?

  • 理论只有在有实际应用时才有值(value)(不允许实践的理论,或者脱离实践的理论都是无效的,就是 pig 屎。通常被称为幻想。
  • 关系数据库的理论是 E F Codd 博士的关系模型
    • 当心,有很多伪装者,他们对什么是关系模型有奇怪而奇妙的想法,因此准确地说,他们有自己版本的“关系理论”和“关系”。可能最好称它们为反关系。
  • 理论有CONSTRAINTs。唯一性是 CONSTRAINT 的一种形式。 CHECKCONSTRAINT 的一种形式。如果没有所需的 CONSTRAINTS,该理论将成为 pig 粪。
    • 反关系理论对数据库需要什么的理解非常有限,因此CONSTRAINTS要少得多。

data integrity

数据完整性无疑是关系模型理论的一部分。数据完整性是目标,它预示着对各种CONSTRAINTS 的需求。如果没有 CONSTRAINTS,您根本无法获得数据完整性。

In a way in which trying to insert a relation between two users when a relationship with swapped IDs already exists violates data integrity?

该理论提供了这样的约束,当然使用 CONSTRAINT

Being practical: Which is the best way to implement and query said relationship?

准确的说,那不是“关系”,而是对关系的约束。

在 DDL 级别,您需要一个调用函数的 CHECK CONSTRAINT。几十年来,这一直是 SQL(关系模型 的数据子语言)的一个普通功能。函数代码为:

...
IF NOT EXISTS (
    SELECT 1
        FROM user_related
        WHERE related_user1 = @related_user2
        AND   related_user2 = @related_user1
    )
...
  • 当心,在免费软件中; Vapor 器皿; noware 类别,他们使用术语 SQL,但没有 SQL 的特性。他们使用该术语是欺诈性的。有些没有CONSTRAINTS;有些没有CHECK(或者更糟,允许关键字但不执行检查);有些没有功能;或可以从 CHECK 调用的函数。

如果您需要符合 SQL 的代码示例,请询问。

关系数据库

users( #user_id )

这不会为您提供唯一的用户行(数据)。这为您提供了用户文件中的唯一记录,这不是唯一的用户。 Relational Model 是合乎逻辑的,它要求 Key 由数据构成,这与 1960 年代由“理论家”提倡的使用物理记录而不是逻辑行的记录归档系统相反。

对于关系型数据库,你需要在构成用户的数据上具有唯一性,一个Key比如user_namesocial_security_no; (name_last, name_first, initial)等,然后可以去掉record id user_id,因为它是多余的,没有目的。

在每个文件中以 ID 开头将确保您拥有一个反关系的 1960 年代记录归档系统。当然,这是“理论家”所提倡的。

关于database - 在方向无关的自反多对多关系中避免重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57621875/

相关文章:

mysql - DB Complex 增量计数器

mysql - 如何将json分解为sql

mysql - 在数据库中建立多个表之间的关系

entity-framework - 在 RavenDB 集合中存储/查询多种类型的最佳方法是什么?

mysql - 实体图中的属性和关系中的属性有什么区别。

database - PostgreSQL:为什么这个简单的查询不使用索引?

mysql - 删除表的一行,该行具有链接到另一个表的键作为外键

iphone - sqlite中的数据插入问题

sql - dropdb mydb 在 postgres 中不工作

python - 只读的django多数据库