两个主列都指向同一个外部列的类似 EAV 的表

o0'*_*0'. 3 sqlite foreign-key primary-key eav

背景:我是一名程序员,虽然不得不多次使用简单的数据库,但从未使用过复杂的数据库。即我精通基本的东西,但对高级功能和设计一无所知。

我需要创建一个包含两个用户之间匹配结果的表,即:

  • table_A: user_id (primary int), 其他东西
  • table_B:user1(主外键指向 table_A user_id),user2(主外键指向 table_A user_id),其他东西

我可以强制执行user2<user1吗?这是为了防止行具有user1==user2防止在这对夫妇被反转时创建行,即我不需要同时拥有(alice,bob)(bob,alice)

- 或者 - 我一开始就做错了,还有另一种完全不同的方法来做到这一点?

显然我可以(并且将会)在添加之前检查这些值,但据我所知,如果我可以在 SQL 中添加一个约束,我最好添加它,以确保它是一致的。

数据库目前是sqlite,但如果这不能在 sqlite 中完成但可以用其他引擎完成(特别是如果 InnoDB),它也可能是一个有用的答案。

PS:我不确定这是否仍然算作 EAV,因为 AFAIK EAV 意味着来自不同表的两个主要部分,以及一个额外的列,而我将有多个。

CL.*_*CL. 5

一个简单的 CHECK 约束工作得很好:

$ sqlite
SQLite version 3.8.4.1 2014-03-11 15:27:36
...
sqlite> CREATE TABLE table_B(
   ...>     user1,
   ...>     user2,
   ...>     [other stuff],
   ...>     CHECK (user2 < user1)
   ...> );
sqlite> INSERT INTO table_B VALUES (1, 0);
sqlite> INSERT INTO table_B VALUES (2, 3);
Error: CHECK constraint failed: table_B
Run Code Online (Sandbox Code Playgroud)

(这与EAV无关。)