为版本化表创建FOREIGN KEY

时间:2015-03-31 09:16:40

标签: sql database foreign-keys

我在表格中有版本逻辑。因此,每个表都包含' is_deleted'和'版本'领域。 ('版本'字段引用所有版本的单个表格)

table1(id, field1_1, field1_2, is_deleted, version[fk to versions.id])
table2(id, field2_1, field2_2, table1_id, is_deleted, version[fk to versions.id])
versions(id, main_version)

当我从db获取记录时,我为每个引用表和表本身使用where子句。类似的东西:

SELECT * FROM table1 AS t1
WHERE (
  (
    (t1.id, t1."version") IN 
    (SELECT sub_t1.id, max(sub_t1."version") FROM table AS sub_t1 GROUP by sub_t1.id)
  ) 
  AND t1.is_deleted IS FALSE
)

对于MySQL,您可以更改' is_deleted'的条件到

is_deleted = 0

现在,我正在添加新表,我想使用外键,但外键只能引用唯一列,但id不是唯一的(它是通过版本保存的),我不能使用复杂密钥,因为仅在smth更改时才创建新版本,仅用于该记录。

我应该省略FK还是应该为每个版本化表添加只有一个列ID的附加表?添加这样的表会提供除数据完整性之外的一些好处吗?添加这样的表会使逻辑变得更复杂。

所以,我应该不受影响地生活或者像这样生活:

table1_ids(id)
table1_versions(id, table1_id[fk to table1_ids.id], ...)
table2_versions(id, ..., table1_id[fk to table1_ids.id],...)
table2_ids(id)

1 个答案:

答案 0 :(得分:1)

您是否可以为每个版本创建架构? 这将是更清洁的解决方案。