考虑部分依赖信息的关系数据库设计?

Relational database design considering partly dependent information?

我有种强烈的感觉,只见树木不见森林,所以我需要你的帮助。

考虑以下两个 table:

create table Category (Category_ID    integer,
                       Category_Desc  nvarchar2(500));

create table Text (Text_Id       integer,
                   Text          nvarchar2(1000),
                   Category_Id   integer references Category.Category_Id);

此代码没有遵循正确的语法,只是为了了解问题所在。

考虑为某些类别保存文本部分以在界面中使用它们的想法,例如消息("You can't do that!"、"Do this!"、...),但也为其他对象创建注释,即。 G。喜欢订单 ("Important customer! Prioritize this order!").

现在是我的问题。其中一些文本位会带来更多信息,例如,如果您在订单中添加 "Important customer" 注释,也会设置 Order.Prio_Flag

现在这是一个非常特殊的信息,仅考虑类别Order_Note使用的文本。我不想将它添加到 Text table,因为大多数条目不受此影响,并且 table 会因为特殊情况而变得越来越拥挤至少部分内容。

我觉得,设计有缺陷,但我也不希望每个类别都有一个 table,并尽可能保持通用。

请记住,这是问题的简化视图。

TL:DR: 如何在不添加新属性的情况下向 table 的内容添加信息,因为新属性只会填充最少的内容条目数。

子类型化和相关属性在关系数据库中很容易实现。例如,如果某些 Text 很重要并且需要具有依赖属性(例如 DisplayColor),您可以将以下 table 添加到您的架构中:

CREATE TABLE ImportantText (
    Text_Id integer NOT NULL ,
    Display_Color integer NOT NULL ,
    PRIMARY KEY (Text_Id),
    CONSTRAINT ImportantTextSubtypeOfText
        FOREIGN KEY (Text_Id) REFERENCES Text (Text_Id)
        ON DELETE CASCADE ON UPDATE CASCADE
);

许多人认为外键约束建立实体之间的关系。那不是他们的目的。它们是约束,即它们将列中的值限制为另一列的子集。这样就建立了一个子类型关系,可以记录额外的属性。

在上面的 table 中,ImportantText 的任何元素都必须是 Text 的元素,并且将具有 Text 的所有属性(因为它必须是记录在Texttable),以及ImportantText.

的附加属性