如何在关系数据库中建立自定义类型的模型?
我对数据库设计相当陌生,但我理解基础知识。 我创建了一个关系数据库,我想做类似于创建可重用类型或类的东西。 例如,假设我有一个Customer
表和一个Item
表。 客户和项目通过标准的一对多关系相关联,所以项目有一个名为CustomerId
的列。
我还想为每个客户和每个项目提供多个“备注”。 在一个正常的OOP模型中,我只需创建一个Note
类并在需要时创建它的实例。 当然,关系数据库是不同的。 我在考虑创建一个Note
表,并且我想要在Customer和Note之间以及Item和Note之间建立一对多的关系。 问题在于Note表必须为希望使用此“类型”的每个其他表创建一列。 (见下面的例子)
我也认为,我可以在Note和Customer / Item(或其他)之间创建一个中间表。 这样可以避免在每个引用它的表中添加额外的列,所以在添加更多需要注释的表时,注释可以保持不变。 我在想这是更好的解决方案。 (见例子)
这种情况通常如何处理? 我接近正确吗? 我非常感谢关于如何设计我的数据库以获得上述功能的建议。
是的,你的结论性例子是正确的,应该是要走的路。
您可以通过创建表在关系数据库中对“复杂类型”进行建模。 您可以将表视为一个类:实际上,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
字段只能是有效的国家,而不是有效的国家。
另外,如你所建议的那样,使用联结表也是处理这种多态关系的合适方法。 您可能有兴趣查看以下堆栈溢出帖子,以获得关于此主题的进一步阅读:
我认为你可以最好的添加一个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