【发布时间】:2018-06-28 06:32:53
【问题描述】:
PostgreSQL 10.1
我很想知道 SO 社区如何处理这个常见的数据库问题。
问题是这样的。我在 ICD_Descriptions 表(下面的中间框)中输入了桌面上各种问题的文字描述。一般来说,每个描述也会有一个代码。但是,随着时间的推移(即几年),特定文本短语/描述的代码会发生变化。因此,对于某些代码到描述,将存在一般的多对多关系。因此,第三个表 dx_log 用于允许代码和描述之间的多对多关系。最后,需要查看“代码描述”的特定组合的其他“子”表将被提供对 dx_log 的主键(recid)的引用。我相信这种安排是相当标准的数据库管理。
好的,现在解决问题。我希望 icd_code 表中的代码对该表是唯一的。我也希望 icd_description 表中的描述对于他们的表来说是唯一的。
问题。这是一个参考系统,对代码表的“数据”部分(代码)或描述(在描述表中)的更改将在子表中看到。
但是,如何正确管理用户对与相应表格的“唯一”规则相冲突的代码或描述的编辑?
例如,假设描述的初始文本是“this is拼写错误”,而另一个描述文本有“this is拼写错误”。在某一时刻,这两个短语共存并且是独一无二的。但是,在稍后的时间点,错误的记录会被纠正(即拼写错误 ---> 拼写错误)。当试图将编辑内容保存到文件中时,将检测到正确的记录已经存在。
因此,如果 dx_log 表在 (icd_description_recid, icd_code_recid) 上也是唯一的,那么 简单地替换对 dx_log 中已经存在的正确拼写记录的引用将导致违反 dx_log 表的唯一性。 因此,我只能想到三个解决方案:
- 子表实际引用的表不能在其引用指针上有唯一性约束,
- 保留 dx_log 上的唯一性约束,但当冲突违反唯一性时,然后使用迁移过程将子表引用移动到现有记录(在 postgresql 中,这将大量使用目录)添加到“新记录”,然后在添加新记录之前删除现有记录。
- 在 dx_log 中添加一个额外的自引用指针,这样当记录与 dx_log 中已经存在的记录冲突时,不要更改它,而是 放置一个指向已经存在的“正确”记录的指针 在 dx_log 中。
我希望我已经很好地解释了我的问题。推荐的方法是什么?
感谢任何cmets。
【问题讨论】:
标签: postgresql database-design