2013-09-26 2 views
1

Нужна консультация лучшего подхода, как спроектировать БД по следующему сценарию:Лучший подход каскадное удаление связанных сущности в MS SQL

После ниже DB структуры exmaple (это не реально просто объяснить проблему)

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 relentionship). Здесь я вижу следующие подходы:

  1. Добавить файл в каждую таблицу, когда я использую его, но я не хочу, чтобы скопировать файл схемы для каждой таблицы
  2. Добавить внешние ключи таблицы файлов (вместо например, например), но поскольку я использую файл, например в 10 таблицах у меня будет 10 внешних ключей в таблице файлов. Это тоже не хорошо
  3. Используйте триггеры, что я не wnat делать

Заранее спасибо

+1

Если у вас есть отношения между 1 и 1 файлом и книгой, зачем нужна таблица файлов? –

+0

Используется также в других таблицах (в Pages for eample). Книга имеет обложку, но страницы в книге могут иметь и другие изображения, логотип, вложения и т. Д. (Обычно это от 1 до 1 повторного использования, один логотип на странице) – vitaly

+0

При разработке баз данных вы не можете продолжать обычно. Если вы создадите его как 1 к 1, у вас есть только этот параметр. Так что это? От 1 до 1 или от 1 до многих или многих. Может ли такое же изображение быть на нескольких страницах? Может ли данная страница иметь несколько изображений? у вас действительно есть отдельная таблица для каждой страницы? – jmarkmurphy

ответ

0

Если такой необходимости это появилось, может быть, кажется, что вам нужно реорганизовать свою базу. Вы сказали, что этот пример не реален, и я не буду спрашивать о N таблицах для страниц, хотя это странно. Если не все файлы имеют отношение 1 к 1, и поэтому вам нужно удалить только файл, к которому не относится другая книга, это похоже на задание для триггера.

+0

Может быть, это не хорошие имена, например ... но я изменил только имена таблиц из реального DB – vitaly

0

Так что вы определили взаимосвязь «многие ко многим» между BookPage и File. это результат отношения «один ко многим» между BookPage и BookPageN, а затем отношения «один ко многим» между File и BookPageN. Чтобы получить отношения, которые вы говорите, вы хотите в тексте, вам нужно повернуть отношение вокруг, чтобы указать от BookPageN до File. Возможно, вместо того, чтобы иметь так много таблиц BookPageN, вы могли бы найти способ объединить их в одну таблицу. Возможно, просто используйте таблицу BookPage. Просто разрешите null для полей, которые являются необязательными.

+0

Это была бы очень большая таблица с aproximatly ~ 100 столбцами, и это рост – vitaly

+1

, если у объекта есть 100 или 1000 атрибутов , все же лучше разместить их в одной таблице. Пока они являются реальными атрибутами. Убедитесь, что вы нормализуете таблицы. Удалите все повторяющиеся атрибуты для подробных таблиц и т. Д. – jmarkmurphy

Смежные вопросы