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

Avoiding duplicates in a reflexive many to many relationship where direction is irrelevant

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

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

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?

  • 理论只有在有实际应用的时候才有价值(不允许实践的理论,或者脱离实践的理论都是无效的,就是猪屎。通常被称为空想。
  • 关系数据库的理论是 Dr E F Codd 的关系模型
    • 当心,有很多伪装者,他们对 关系模型 有奇怪而奇妙的想法,因此准确地说,他们有自己的版本"relational theory" 和 "relational"。可能最好称它们为反关系。
  • 理论有CONSTRAINTs。唯一性是 CONSTRAINT 的一种形式。 CHECKCONSTRAINT 的一种形式。没有要求的CONSTRAINTS,理论就是猪粪。
    • 反关系理论对数据库需要什么的理解非常有限,因此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?

准确的说,那不是"relationship",而是对关系的约束

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

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

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

关系数据库

users( #user_id )

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

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

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