2


0

多くのタイプのエンティティに対する多対多の関係

ディスク、フォルダ、ファイル、リンクの4つのテーブルがあります。 これは4つのタイプのエンティティであり、1つのタイプにマージすることはできません(例: 属性の数とタイプが異なるためです。 そして、関係があります:

  • ディスクには、フォルダー、ファイル、およびリンクを含めることができます。

  • フォルダーには、フォルダー、ファイル、およびリンクも含めることができます。

  • ファイルとリンクには何も含めることはできません。

さらに、すべてのエンティティには、表示される順序があります(例: 「ユーザー定義」、アルファベット順などではありません)。 これは実際の問題の単純化された例であり、実際にはより多くのエンティティがあり、関係はより複雑です。

それでは、提案されているテーブルの構造は何ですか?

質問に答えてくれたみんなありがとう

4 Answer


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

追加のチェックウィルストアドプロシージャまたはトリガーを実装する必要があります。

これにより、階層の構築(ディスクのすべてのサブフォルダーの検索など)がはるかに簡単になります。


0


実際には1対多の関係です。

  • Disk`には0から多くの Folder`があり、 `Folder`はちょうど1に属します 「ディスク」

  • Folder`には0から多くの File`があり、 File`はちょうど1に属します `フォルダ

  • Folder`には0から多くの Link`があり、 Link`にはちょうど1が属します `フォルダ

ディスクテーブル

-- Disk
ID
Label
OrderNumber

すべてのフォルダー、ファイル、およびリンクを表すアイテムテーブル。

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

以下を持たないことは、ビジネスロジック次第です。

  • ファイルはファイルに属します

  • リンクはファイルに属します

  • フォルダーはリンクに属します

    1. 等々


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


リンクを作成できる_Rules_とそれらの表示順序を定義するテーブルを使用します。

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
)

そんな感じ。

これにより、必要に応じてルール/リンクを簡単に拡張できます。