2010-01-15 82 views
2

我有四個表:磁盤,文件夾,文件和鏈接。它有四種類型的實體,並且它們不能合併爲一種類型(例如合併成一個表),因爲它們具有不同的屬性數量和類型。並且存在關係:許多類型的實體的多對多關係

  • 磁盤可以包含文件夾,文件和鏈接;
  • 文件夾也可以包含文件夾,文件和鏈接;
  • 文件和鏈接不能包含任何內容。

此外,所有實體都有顯示它們的順序(例如「用戶定義的」,而不是按字母順序排列的或別的東西)。這是一個實際問題的簡單例子,實際上有更多的實體和關係更復雜。

那麼,表的建議結構是什麼?

謝謝大家誰回答這個問題

+0

看來你已經實際回答了你自己的問題。您遇到困難的多對多關係有任何方面嗎? – 2010-01-15 11:53:11

+0

是的。可能至少有兩個限制: - 父子限制:磁盤不能包含磁盤,鏈接和文件不能包含任何其他實體等 - 顯示順序限制:例如,一些文件夾和一些與一個磁盤文件不能有相同的顯示順序 所以,我想實現的數據庫結構,這些限制是否有可能 – 2010-01-15 12:16:47

回答

0

這是actualy一個一對多的關係爲:

  • 一個Disk有0到許多FolderFolder只能屬於1 Disk
  • 一個Folder有0到很多FileFile完全屬於1 Folder
  • A Folder有0到許多LinkLink只能屬於1 Folder

er diagram http://bit.ly/4AKMXV

磁盤表

-- Disk 
ID 
Label 
OrderNumber 

代表所有文件夾,文件和鏈接項目表。

-- Item 
ID 
Label 
ItemType COMMENT 'Folder|File|Link' 
ParentId 
OrderNumber 

它是由你的業務邏輯不有:

  • 文件屬於文件
  • 鏈接屬於文件
  • 文件夾屬於鏈接

。 。等等

+0

其實 - 磁盤有0到許多文件夾 - 磁盤有0到多個文件 - 磁盤有0到多個鏈接 - 文件夾有0到多個文件夾 - 文件夾有0到多個文件 - 文件夾有0到多個鏈接 在另一方面 - 文件夾只能屬於1個磁盤或 - 文件夾只能屬於1個文件夾 - 文件只能屬於1磁盤或 - 文件只能屬於1個文件夾 - 鏈接只能屬於1磁盤或 - 鏈接完全屬於1個文件夾 (!)所有實體都應該訂購(在其父代的範圍內) 所以,並不存在簡單的一對多關係 – 2010-01-15 12:00:47

+0

所以你說'文件'和'鏈接'可以屬於'disk'而不在'文件夾中?然後,較少混淆的解決方案是有一個「文件夾」調用** root **,將其視爲特殊的「文件夾」 – 2010-01-15 12:02:47

0

使用鏈接表

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的定義鏈接的項目的關係內的順序位置。

0

我會去一張表,它定義了規則它允許建立鏈接,以及這些鏈接的顯示順序。

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 
) 

類似的東西。

這也很容易讓你擴大規則/鏈接的要求。

1

我會去與其他檢查鄰​​接表型號爲引用:

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

您需要實現額外的檢查將存儲過程或觸發器。

這樣,您就可以更輕鬆地構建層次結構(如查找磁盤的所有子文件夾)。