1

我的问题是关于将两个联结表合并为一个的想法,用于类似相关的表。请阅读以了解我的意思。另请注意,这确实是我面临的一个问题,因此与这个论坛有关。这只是一个具有广泛影响的话题,如果您愿意的话,我希望能引起各专业人士的更多参与,以获得更好的“最佳实践”普查。

我有这个相当具有挑战性的数据库设计问题。我希望这将是一个许多人可以贡献和学习的维基。为了使这更容易,我创建了一组图形,并将问题分解为 1) 过程和 2) 结构。

工艺步骤

  1. 提出了文档(出版物)的请求(DocRequest)。
  2. 如果所述出版物不存在,则创建新出版物。
  3. 运行日志 (StatusReport) 会保留以了解满足请求的进度。

注意:对于任何给定的出版物,可能有许多 DocRequests 和 StatusReports(包括更新)

数据库结构

注意:DocRequest 和 StatusReport 表都有许多字段和支持表,未在附图中显示。此外,特定的出版物是那些表中所有记录所属的主记录。

--当前实施-- 在此处输入图像描述

注意:这种设计的主要缺陷是,每当您创建新的 DocRequest 和 StatusReport 记录时,您还必须在 Publications 表中创建一个新记录(其作用类似于联结表),但这也会创建一个新的 Publication结果。这不是期望的行为。

--典型实现--(对于这种类型的关系) 在此处输入图像描述

注意:这没问题,并且可能是理想的,但处理对 DocRequest 和 StatusReport 表的更新,独立地将它们链接到它们所属的出版物。

--我的首选实现--(对于这种特殊情况) 在此处输入图像描述

注意:我在这里的想法只是将双联结表合并为一个。在这种情况下,只要 DocRequest 或 StatusReport 发生插入,联结表就会获得一条新记录。我可能会用触发器来处理这个问题。

讨论

现在进行讨论。如果您认为这是一个坏主意,我想从我的数据库开发人员那里知道,以及由此可能产生的问题。我认为记录的净数量应该与两个单独的联结表相同,并且实际上通过节省额外的 ID 列来使用更少的空间。:)

让我知道你们的想法。我真的很想让很多人参与这个讨论。干杯! :)

4

1 回答 1

2

我认为你在考虑连接表时会伤害自己。想想桌子。

  • 由于 StatusReport 与文档请求的状态有关,因此您需要一个表格以某种方式将这两者关联起来。
  • “StatusReport”对于存储有关文档请求状态的事实的表来说是一个糟糕的名称。
  • 对于任何表中的任何列,“ID”都是一个糟糕的名称。
  • 出版物的 id 号似乎与文档请求有关,而不是与请求的状态有关。(你说,“如果说出版物不存在,则创建一个新出版物。”坦率地说,这已经接近于没有意义的边缘。)所以出版物编号几乎肯定属于 DocRequest 表。

参考您首选实现的图表,我将删除表 TripleJunction,并将 StatusReport 替换为此。

-- Predicate: Document request number (doc_request_id) has status (status) 
--            as of date and time (status_as_of).
create table document_request_status (
  doc_request_id integer not null references DocRequest (id),
  status_as_of timestamp not null default current_timestamp,
  status varchar(10) not null,
  -- other columns go here
  primary key (doc_request_id, status_as_of)
);
于 2011-09-29T00:39:24.690 回答