首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我需要该企业的名称与其注册时的名称相同,而不是其当前的价值。

我需要该企业的名称与其注册时的名称相同,而不是其当前的价值。
EN

Stack Overflow用户
提问于 2019-01-24 16:11:29
回答 2查看 32关注 0票数 1

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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和唯一性代码。

票数 0
EN

Stack Overflow用户

发布于 2019-01-26 05:27:36

有几种可能的解决方案,很难确定哪一种方案是最简单的。

侧评论:您的问题仅限于有效地管理名称,但我想指出的是,您的数据库对正在移动、重命名或删除的文件非常敏感。如果在OS级别发生任何事情,您的数据库将无法保持最新的记录。你也应该考虑做点什么。

在我考虑过的少数解决方案中,最好的规范化解决方案是下面的模式:

代码语言:javascript
复制
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表是很有吸引力的解决方案,但只是乍一看。

特别是,你必须确保一个公司总是有一个,而一个只有一个“活跃”的名字是不容易做的事情。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54350907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档