我有四个表:磁盘、文件夹、文件和链接。它是四种类型的实体,它们不能合并为一种类型(例如合并到一张表中),因为它们的属性数量和类型不同。并且有关系:
- 磁盘可以包含文件夹、文件和链接;
- 文件夹也可以包含文件夹、文件和链接;
- 文件和链接不能包含任何内容。
此外,所有实体都有显示顺序(例如“用户定义”,而不是字母顺序或其他顺序)。这是实际问题的简化示例,实际上有更多的实体和更复杂的关系。
那么,建议的表结构是什么?
感谢所有回答问题的人
我有四个表:磁盘、文件夹、文件和链接。它是四种类型的实体,它们不能合并为一种类型(例如合并到一张表中),因为它们的属性数量和类型不同。并且有关系:
此外,所有实体都有显示顺序(例如“用户定义”,而不是字母顺序或其他顺序)。这是实际问题的简化示例,实际上有更多的实体和更复杂的关系。
那么,建议的表结构是什么?
感谢所有回答问题的人
我会选择邻接列表模型,并额外检查参考:
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))
您需要对存储过程或触发器实施额外的检查。
这样,您将能够更轻松地构建层次结构(例如,查找磁盘的所有子文件夹)。
它实际上是一对多的关系:
Disk
有 0 到多个Folder
,而 aFolder
正好属于 1Disk
Folder
有 0 到多个File
,而 aFile
正好属于 1Folder
Folder
有 0 到多个Link
,而 aLink
正好属于 1Folder
磁盘表
-- Disk
ID
Label
OrderNumber
表示所有文件夹、文件和链接的项目表。
-- Item
ID
Label
ItemType COMMENT 'Folder|File|Link'
ParentId
OrderNumber
不具备以下条件取决于您的业务逻辑:
.. 等等
使用链接表
CREATE TABLE Disk_Files
(
DiskID int
,FileID int
,SortOrder int
)
CREATE TABLE Disk_Folders
(
DiskID int
,FolderID int
,SortOrder int
)
CREATE TABLE Disk_Links
(
DiskID int
,LinkID int
,SortOrder int
)
CREATE TABLE Folder_Files
(
FolderID int
,FileID int
,SortOrder int
)
CREATE TABLE Folder_Links
(
FolderID int
,LinkID int
,SortOrder int
)
在所有链接表中,SortOrder定义了链接项在关系中的序号位置。
我会使用一个表格,该表格定义了允许建立链接的规则,以及这些规则的显示顺序。
DECLARE @Entity_Linkk_Rules TABLE(
EntityFromType VARCHAR, --eg Disk
EntitytoType VARCHAR, --eg Folder
DisplayOrder INT
)
然后有一个包含这些类型的多对多链接结构
DECLARE @Entity_Links TABLE(
EntityFromType VARCHAR,
EntityFromID INT,
EntityToType VARCHAR,
EntityToID INT
)
类似的东西。
这也可以让您轻松地根据需要扩展规则/链接。