没有 1 列的数据库设计 table

Database design without a 1 column table

我一直在进行数据库设计,但遇到了瓶颈。我最终得到的是我正在阅读的不是规范化的数据库结构,但我在尝试找到 "more correct" 设计时遇到了问题,如果这个设计是 acceptable 我该如何执行它访问?

TLDR:如果将单列设置为自动编号的 table 是 acceptable 设计,您如何使用 Access 在其中插入记录?

关注的数据库部分正在创建用于存储公司的结构。对此的要求是,任何更改都需要得到另一位用户的批准,并且需要捕获所有历史更改,以便可以轻松还原,而且一家公司可以有多个别名,但只有一个合法名称。

我的解决方案中有三个 table,但其中一个是单列 table。从我读到的内容来看,95% 的人都认为堆栈溢出是一个非常糟糕的主意,但我发现一个 post 是有人认为它是有案例的。我认为这也是不正常的,因为我找不到一种方法来在 table 中创建一个只有自动编号列的新记录(在 Access 中我还没有尝试过其他列)。

Table结构

  1. 公司名称:ID、公司 ID、合法名称、创建者、创建于、批准于、批准者、事件 ID、有效 (一家公司可能有几个不同的名称,public:TD vs Toronto Dominion。每个名称都插入此处并引用其所属公司)

  2. 公司:ID(自动编号) (一家公司存在,这是它的 ID)

  3. 公司历史:ID、公司 ID、市场 ID、控股公司 ID、创建者、创建于、批准于、批准者、事件 ID、有效 (这些是对公司所做的历史变更,谁做的,谁批准的)

专栏注释:

事件 ID :是对 table 的 FK 引用,保存每条已创建、更新或删除记录的操作记录。 (用户研究使用方法 [y]、错别字修复、...)

Is Active : 由于无法删除记录(需要保留历史记录),此列用于跟踪是否要将此记录包含在查询中。

我看到的选项及其问题:

我可以摆脱公司 table 并使公司历史记录:ID 成为新的公司 ID,但我发现在这种情况下,每次我想更新公司时,我都需要更新每个 FK参考以前的公司 ID(我认为这不是一个非常规范的方法)

我看到的另一个选项是我摆脱公司 table 并使用公司名称:ID 作为公司 ID,我会在公司名称中添加一个名为公司 ID 别名的列。我发现该解决方案为我存储的数据增加了复杂性,其中别名具有与别名条目不同的公司信息。

另一个选项是我可以添加以下列:创建者、创建于、批准于、批准者、事件 ID 和处于活动状态,但这将重复在公司历史中该公司的第一条记录中找到的信息table 这并没有向这条记录添加任何真实的描述。

另一个选项是我让公司 table 成为公司历史的镜像,当我在公司中更新或插入记录时,我也会插入公司历史记录。通过这个解决方案,我再次发现我重复了信息,"Companies History" 中的最新记录将包含在 Companies

中最后插入或更新的记录中找到的相同信息

另一种选择是用短文本替换公司:ID 自动编号,我只得到当前时间戳的哈希值 + 随机整数。我现在可以使用 access 将新记录插入到 table 中,但我觉得这太过分了,因为我只需要与自动编号完全相同的功能。

另一种选择是仅将法定名称移至公司 table,但现在当公司的法定名称发生变化时,我无法进行跟踪。此外,如果我想要所有名称的列表,我需要在公司和公司名称上使用联合。我发现使用联合会降低查询的性能,我只在明确需要时才使用它们。

如果我不想复制任何信息并且不想更新所有 FK,那么我似乎需要一个 table 单列。如果这是 acceptable,我该如何将记录插入 table,并且在 Access 中单列设置为自动编号。

如果 Companies 可以从 CompanyNames (select distinct CompanyId from CompanyNames) 推导出来,则没有必要再次存储该信息。如果需要,只需将 table 替换为视图即可(但它的附加值很小)。

另一方面,如果 CreatedOn 指的是公司创建(而不是行创建),那么它显然是公司的 属性,我宁愿使用
Companies --> Aliases.
但是我当然不知道你所面对的现实的来龙去脉。