我将用一个例子来解释这个问题:我正在设计一个表中引用完整性的具体案例。在模型中有两个表,企业表和文档表。我们注册公司,然后有人插入与之相关的文件。企业名称是可变的。在恢复文档时,我需要企业的名称与注册时的名称相同,而不是它当前的值。我想的解决方案是用相同的代码在每次更改中重新注册公司,这样更新的名称就会产生预期的结果,但我不确定这是否是最好的解决方案。有人能提个建议吗?

发布于 2019-01-24 18:14:33
向企业添加日期范围: valid_from,valid_to。初始化为-infinity +无穷大。当您更改企业名称时:将现有行( valid_to =+无穷大)更新为now(),并使用valid_from = now()插入新名称,valid_to =+无穷大。
向文档中添加日期字段,类似于create_date。然后,在加入企业时,在e.valid_from和e.valid_to之间加入ID和e.valid_to。
这是一种简单化的方法,打破了id和代码的唯一性等问题。要处理这个问题,您可以使用id、from、to、name在单独的表中记录名称。保留原始表中的id和唯一性代码。
发布于 2019-01-26 05:27:36
有几种可能的解决方案,很难确定哪一种方案是最简单的。
侧评论:您的问题仅限于有效地管理名称,但我想指出的是,您的数据库对正在移动、重命名或删除的文件非常敏感。如果在OS级别发生任何事情,您的数据库将无法保持最新的记录。你也应该考虑做点什么。
在我考虑过的少数解决方案中,最好的规范化解决方案是下面的模式:
CREATE TABLE Enterprise
(
IdEnterprise SERIAL PRIMARY KEY
, Code VARCHAR(4) UNIQUE
, IdName INTEGER DEFAULT -1 /* This will be used to get a single active name */
);
CREATE TABLE EnterpriseName (
IDName SERIAL PRIMARY KEY
, IdEnterprise INTEGER NOT NULL REFERENCES Enterprise(IdEnterprise) ON UPDATE NO ACTION ON DELETE CASCADE
, Name TEXT NOT NULL
);
ALTER TABLE Enterprise ADD FOREIGN KEY (IdName) REFERENCES EnterpriseName(IdName) ON UPDATE NO ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED;
CREATE TABLE Document
(
IdDocument SERIAL PRIMARY KEY
, IdName INTEGER NOT NULL REFERENCES EnterpriseName(IDName) ON UPDATE NO ACTION ON DELETE NO ACTION
, FilePath TEXT NOT NULL
, Description TEXT
);使用标志和/或时间戳或将企业名称移动到document表是很有吸引力的解决方案,但只是乍一看。
特别是,你必须确保一个公司总是有一个,而一个只有一个“活跃”的名字是不容易做的事情。
https://stackoverflow.com/questions/54350907
复制相似问题