如何在关系数据库中建立自定义类型的模型?

我对数据库设计相当陌生,但我理解基础知识。 我创建了一个关系数据库,我想做类似于创建可重用类型或类的东西。 例如,假设我有一个Customer表和一个Item表。 客户和项目通过标准的一对多关系相关联,所以项目有一个名为CustomerId的列。

我还想为每个客户和每个项目提供多个“备注”。 在一个正常的OOP模型中,我只需创建一个Note类并在需要时创建它的实例。 当然,关系数据库是不同的。 我在考虑创建一个Note表,并且我想要在Customer和Note之间以及Item和Note之间建立一对多的关系。 问题在于Note表必须为希望使用此“类型”的每个其他表创建一列。 (见下面的例子) note_relation1

我也认为,我可以在Note和Customer / Item(或其他)之间创建一个中间表。 这样可以避免在每个引用它的表中添加额外的列,所以在添加更多需要注释的表时,注释可以保持不变。 我在想这是更好的解决方案。 (见例子) note_relation2

这种情况通常如何处理? 我接近正确吗? 我非常感谢关于如何设计我的数据库以获得上述功能的建议。


是的,你的结论性例子是正确的,应该是要走的路。

您可以通过创建表在关系数据库中对“复杂类型”进行建模。 您可以将表视为一个类:实际上,ORM解决方案通常将类直接映射到表。 自定义类型的一个实例是其表中的一行,实例可以由主键的值引用。

通过使用与“复杂类型”的主键相同的数据类型,并使用外键约束强制关系,可以将其自定义的“复杂类型”用于其他表中的字段。

让我们为“国家”构建一个复杂的类型:

CREATE TABLE countries (
   iso_code     char(2)       NOT NULL,    
   name         varchar(100)  NOT NULL,
   population   bigint       
   PRIMARY KEY (iso_code)
);

让我们添加几个“国家”实例:

INSERT INTO countries VALUES ('IE', 'Republic of Ireland', 4470700);
INSERT INTO countries VALUES ('US', 'United States of America', 310403000);

现在我们将在“用户”表中使用我们复杂的“国家/地区”类型:

CREATE TABLE users (
   id          int            NOT NULL,    -- primitive type
   name        varchar(50)    NOT NULL,    -- primitive type
   age         int,                        -- primitive type
   country     char(2),                    -- complex type
   PRIMARY KEY (id),
   FOREIGN KEY (country) REFERENCES countries (iso_code)
);

通过上述模式,我们保证users表的country字段只能是有效的国家,而不是有效的国家。

另外,如你所建议的那样,使用联结表也是处理这种多态关系的合适方法。 您可能有兴趣查看以下堆栈溢出帖子,以获得关于此主题的进一步阅读:

  • 你如何在数据库中表示继承?
  • 可能对两个可能的表之一执行MySQL外键?

  • 我认为你可以最好的添加一个Note字段到Customer表和Item表。 在此注释字段(外键)中,您可以存储属于客户/项目的注释的ID。 为了确保您可以将多个注释附加到客户或项目,您可以选择添加注释表并将单个注释附加到可以附加到客户/项目表的“注释”表中。

    链接地址: http://www.djcxy.com/p/48237.html

    上一篇: How to model a custom type in a relational database?

    下一篇: Creating a symbolic link in a bash script in a different folder