PostgreSQL中的非唯一外键?

西蒙菲

我有一个数据库设计问题,对以下两个问题中的任何一个都会有所帮助,我将不胜感激:

1)解释为什么我在做一个错误的设计决定,以及如何更好地进行设计

2)示例如何在PostgreSQL中实际实现所需的设计

简而言之,我正在设计一个树形结构,其中每个节点都应具有如下的修订历史记录:

CREATE TABLE Nodes
(
  nid BIGSERIAL PRIMARY KEY,
  node_id BIGINT NOT NULL,
  parent_nodeid BIGINT,
  revision_id INTEGER NOT NULL,

  .. additional columns with info about this node ..
)

这个想法如下:我可能有一个像这样的结构:

root node
    child node 1
    child node 2

当用户编辑“根节点”中的信息时;我想保留以前值的日志,而不是仅替换现有日志中的值,所以我改为创建该行的新“修订”-因此,将来某个时候用户可以执行“撤消”并返回到节点的先前配置。

我要实现的是,子节点自动引用新的父节点,而不必更新parent_nodeid子节点,因为根节点的新修订版不应更改节点树的层次结构。

我知道我无法从中添加外键Nodes.parent_nodeidNodes.node_id因为PostgreSQL要求外键引用具有唯一值的列-但我迷失于如何添加某种约束,该约束至少可以保证Nodes.parent_nodeid引用现有Nodes.node_id值,即使它不会是唯一的。

任何帮助/想法将不胜感激!

克林

您不需要树结构,因为您始终只有一个级别的依赖关系。规范化的数据库设计:

create table nodes (
    node_id bigserial primary key,
    description text
)

create table revisions (
    revision_id bigserial primary key,
    node_id bigint references nodes,
    description text
);

你需要一个触发nodes其复制旧行descriptionsinsertupdate从副本和一排revisions,而不是delete,实施undo

还不清楚为什么要保留两个节点标识符nidnode_id这似乎是多余的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

结合非唯一外键创建主键?

来自分类Dev

SQLite:使外键唯一

来自分类常见问题

JPA一对一关系创建一个非唯一的外键

来自分类Dev

表示Python中的非唯一键/值对

来自分类Dev

从外键的外键验证唯一性

来自分类Dev

通过附加引用在非唯一引用列上指定外键

来自分类Dev

在休眠中使用非主键属性(唯一)作为外键

来自分类Dev

在PostgreSQL中查找非唯一行的ID

来自分类Dev

外键列的唯一约束

来自分类Dev

Django模型:外键的唯一值

来自分类Dev

外键列的唯一约束

来自分类Dev

PostgreSQL中的JSON外键

来自分类Dev

在PostgreSQL中索引外键

来自分类Dev

JPA一到一个关系创建一个非唯一的外键

来自分类Dev

休眠:映射指向唯一键的外键

来自分类Dev

外键引用PostgreSQL中的其他外键

来自分类Dev

我可以在EF6中使用外键来唯一约束吗?

来自分类Dev

无法在其中字段是唯一索引的mysql中添加外键

来自分类Dev

隐式地将唯一记录插入到插入的外键表中

来自分类Dev

如何确保所有具有相同外键的行在PostgreSQL数据库中都具有唯一的名称?

来自分类Dev

连接没有唯一键的列,并在新列中写下非唯一组合

来自分类Dev

PostgreSQL:相同的高级键中的唯一值,但是直接子键中的值不同

来自分类Dev

在Postgresql中遵循外键输入功能

来自分类Dev

R中具有非唯一键组合的长到宽

来自分类Dev

使用php中的非唯一键从json获取值

来自分类Dev

如何在 JavaScript/TypeScript 中创建具有非唯一键的 Map?

来自分类Dev

EF6对外键的唯一约束

来自分类Dev

外键可以是唯一的主键吗

来自分类Dev

如何添加唯一约束作为外键?