次のシナリオで DB を設計する最善の方法についてアドバイスが必要です。
以下のDB構造の例に従ってください(問題を説明するだけでは現実的ではありません)
File
(
Id INT PRIMARY KEY...,
Name VARCHAR(),
TypeId SMALLINT,
...
/*other common fields*/
)
FileContent
(
Id INT PRIMARY KEY...,
FileId FOREIGN KEY REFERENCES File(Id) NOT NULL ON DELETE CASCADE UNIQUE,
Content VARBINARY(MAX) NOT NULL,
)
Book
(
Id INT PRIMARY KEY...,
Name VARCHAR(255),
Author VARCHAR(255)
...
CoverImageId FK REFERENCES File(Id),
)
BookPageType
(
Id TINYINT PRIMARY KEY...,
Name VARCHAR(50),
)
BookPage
(
Id INT PRIMARY KEY...,
TypyId TINYINT FOREIGN KEY REFERENCES BookPageType(Id),
BookId INT FOREIGN KEY REFERENCES Book(Id) ON DELETE CASCADE,
Name VARCHAR(100),
CreatedDate DATETIME2,
...
/*other common fields*/
)
BookPage1
(
Id PRIMARAY KEY REFERENCES BookPage(Id) NOT NULL ON DELETE CASCADE,
FileId PRIMARAY KEY REFERENCES File(Id)
...
/* other specific fileds */
)
...
BookPageN
(
Id PRIMARAY KEY REFERENCES BookPage(Id) NOT NULL ON DELETE CASCADE,
ImageId PRIMARAY KEY REFERENCES File(Id),
...
/* other specific fileds */
)
ここで質問は、すべてのページとデータを含む本を削除したい (カスケード削除でうまく機能する) ことですが、カスケードで関連ファイルも削除する方法 (1 対 1 の関係) です。ここでは、次のアプローチを参照してください。
- 使用時にすべてのテーブルにファイルを追加しますが、すべてのテーブルのファイル スキーマをコピーしたくありません
- 外部キーをファイル テーブルに追加します (たとえば、ページの代わりに)。ただし、たとえば 10 個のテーブルでファイルを使用するため、ファイル テーブルに 10 個の外部キーがあります。これもダメ
- トリガーを使用して、やりたくないこと
前もって感謝します