【发布时间】:2020-03-16 21:29:35
【问题描述】:
出于背景目的:我将 PostgreSQL 与 SQLAlchemy (Python) 结合使用。
给定一个独特的references 表:
references_table
-----------------------
id | reference_code
-----------------------
1 | CODEABCD1
2 | CODEABCD2
3 | CODEWXYZ9
4 | CODEPOIU0
...
在典型情况下,我会有一个单独的items 表:
items_table
-----------------------
id | item_descr
-----------------------
1 | `Some item A`
2 | `Some item B`
3 | `Some item C`
4 | `Some item D`
...
在这种典型场景中,references 和 items 之间的多对多关系设置在联结表中:
references_to_items
-----------------------
ref_id (FK) | item_id (FK)
-----------------------
1 | 4
2 | 1
3 | 2
4 | 1
...
在这种情况下,很容易建模并获取与同一项目关联的所有引用,例如,项目 1 具有上表中的引用 2 和 4。
但是,在我的场景中,没有 items_table。但我仍然想模拟一些参考引用相同(未表示的)项目的事实。
我看到了通过这样的多对多联结表(关联 references 表的 FK)来建模的可能性:
reference_similarities
-----------------------
ref_id (FK) | ref_id_similar (FK)
-----------------------
2 | 4
2 | 8
2 | 9
...
对于我的数据模型而言,ID 为 2、4、8 和 9 的引用将被视为“相似”。
但是,这里的不便之处在于,此类模型需要选择一个引用(在 id=2 之上)作为“枢轴”,而在reference_similarities 表中可以将多个其他引用声明为“相似”。参考 2 类似于 4,参考 2 类似于 8 ==> 因此 4 类似于 8。
所以问题是:有没有更好的设计不涉及上面的“枢轴”FK?
理想情况下,我会将“相似性”存储为 FK 数组,如下所示:
reference_similarities
------------------------
id | ref_ids (Array of FKs)
------------------------
1 | [2, 4, 8, 9]
2 | [1, 3, 5]
..但我从https://dba.stackexchange.com/questions/60132/foreign-key-constraint-on-array-member 了解到,目前不可能拥有foreign keys in PostgreSQL arrays。所以我试图为这个模型找出一个更好的设计。
【问题讨论】:
标签: postgresql database-design sqlalchemy junction-table