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

时间:2010-10-04 12:31:41

标签: database database-design types relational-database

我对数据库设计还不熟悉,但我了解基础知识。我正在创建一个关系数据库,我想做一些类似于创建可重用类型或类的东西。例如,假设我有一个Customer表和一个Item表。客户和项目通过标准的1对多关系相关联,因此Item有一个名为CustomerId的列。

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

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

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

2 个答案:

答案 0 :(得分:4)

是的,你的结论性例子是正确的,应该是可行的方法。

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

您可以将自定义“复杂类型”用于其他表中的字段,方法是使用与“复杂类型”的主键相同的数据类型,并使用foreign key constraint强制执行关系:

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

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)
);

使用上述模型,我们可以保证country表的users字段只能是有效国家/地区,而且只能是有效国家/地区。

此外,正如您所建议的那样,使用junction table也是处理此类polymorphic relationship的合适方法。您可能有兴趣查看以下Stack Overflow帖子,以便进一步阅读此主题:

答案 1 :(得分:0)

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

相关问题