【问题标题】:database design: link table for multiple different tables数据库设计:多个不同表的链接表
【发布时间】:2020-01-16 20:32:37
【问题描述】:

我有一个关于数据库设计的概念性问题,在我作为开发人员的历史中多次出现。 想象一下,我有一个过去设计的更大的数据库,并且已经投入生产(例如,您可以使用 http://sqlfiddle.com/#!9/7c06f/1,一个库数据库)。

现在有一个新功能请求:对于每个表中的每个现有对象,都应该有一个“帮助文本”(或不同的东西,一个错误,一个标签......),你可以在一个地方查看。

我过去曾多次实施类似的方法,但每次都对解决方案不满意。

一种解决方案是为每个表创建一个链接表,如下所示:

CREATE TABLE BooksHelp (
    BookId  INT NOT NULL,
    HelpText VARCHAR NOT NULL
);


CREATE TABLE AuthorHelp (
    AuthorId  INT NOT NULL,
    HelpText VARCHAR NOT NULL
);

...

但我需要多个链接表,这使得选择每个现有的“帮助文本”变得困难。

你会如何设计这个问题?还有其他更好的解决方案吗?

【问题讨论】:

  • 我可能会在每个表中添加“helptext”列并创建一个视图,该视图执行 UNION 以显示所有表或检查所有表并使用动态 SQL 返回该信息的函数(但您如果您使用 MySQL,则没有该选项)

标签: sql database-design


【解决方案1】:

这似乎与 map polymorphism to the relational model 的尝试相似——只是不合适——没有明显的正确答案。

有一些明显的解决方案。您确定的那个(将帮助文本存储在链接表中)很整洁,但是如果您要检索属于出版商的作者的所有书籍等,则需要大量连接。正如业务逻辑所说“所有对象都应该有helptext”(并且我假设每一行都有不同的帮助文本),将它存储在子表中并不是很合乎逻辑 - “helptext”是每个对象的属性,而不是相关概念。

您还可以为每个表格添加一个帮助文本列。这将属性存储在主表中,并减少了认知负荷(以及连接数)。如果每个作者、书籍等都有自己的帮助文本,这是合乎逻辑的。

【讨论】:

    【解决方案2】:

    对于某种文本项目,特别是如果它们用于多种类型(如帮助文本),似乎最好将它们的文本数据集中在一个表中,并将引用存储在需要它们的表中。此设计还支持多语言应用程序,其中必须以多种语言维护文本项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多