database - 许多类型实体的多对多关系

标签 database many-to-many relationship entities

我有四个表:磁盘、文件夹、文件和链接。它是四种类型的实体,它们不能合并为一种类型(例如合并为一个表),因为它们具有不同的数量和类型的属性。并且存在关系:

  • 磁盘可以包含文件夹、文件和链接;
  • 文件夹也可以包含文件夹、文件和链接;
  • 文件和链接不能包含任何内容。

此外,所有实体都有显示顺序(例如“用户定义”,而不是字母顺序或其他顺序)。这是实际问题的简化示例,实际中实体更多,关系更复杂。

那么,建议的表格结构是什么?

感谢所有回答问题的人

最佳答案

我会选择邻接表模型并额外检查引用:

CREATE TABLE inode (type INT NOT NULL, id INT NOT NULL, parent INT NOT NULL, order INT NOT NULL, PRIMARY KEY (type, id), CHECK (type IN (1, 2, 3, 4)))

CREATE TABLE disk (type INT NOT NULL, id INT NOT NULL PRIMARY KEY, disk_attributes ..., CHECK (type = 1), FOREIGN KEY (type, id) REFERENCES inode (type, id))

CREATE TABLE file (type INT NOT NULL, id INT NOT NULL PRIMARY KEY, file_attributes ..., CHECK (type = 2), FOREIGN KEY (type, id) REFERENCES inode (type, id))

CREATE TABLE link (type INT NOT NULL, id INT NOT NULL PRIMARY KEY, link_attributes ..., CHECK (type = 3), FOREIGN KEY (type, id) REFERENCES inode (type, id))

CREATE TABLE folder (type INT NOT NULL, id INT NOT NULL PRIMARY KEY, folder_attributes ..., CHECK (type = 4), FOREIGN KEY (type, id) REFERENCES inode (type, id))

您需要对存储过程或触发器实现额外检查。

这样,您将能够更轻松地构建层次结构(例如,查找磁盘的所有子文件夹)。

关于database - 许多类型实体的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2071197/

相关文章:

c# - 在 NHibernate 中审核多对多关系

java - JPA 坚持 ManyToMany 与关联类?

mysql - Laravel 5.6 中的 Controller 继承

php - 关系设计

java - 使用 JPA 时,@Entity 和 @Table 中的 name 参数有什么区别?

mysql - 使用 MySQL INSERT IGNORE 防止重复条目(性能问题?)

android - 如何在android中使用Db4o创建数据库?

database - facebook 对他们的数据库进行了多少非规范化以通过网络分解事物并因此缩小表格并加快系统速度?

java - MySQLIntegrityConstraintViolationException :Duplicate entry exception for @JoinTable in hibernate

javascript - backbone.js - 以 RESTful 方式处理模型关系