Как применить правила целостности данных в моей базе данных? - PullRequest
4 голосов
/ 17 сентября 2008

Я разрабатываю эту коллекцию классов и абстрактных (MustInherit) классов…

class diagram

Это таблица базы данных, где я собираюсь хранить все это ...

database table

Насколько известно базе данных Microsoft SQL Server, это все столбцы, допускающие значение NULL («Разрешить пустые значения»).

Но на самом деле это зависит от класса, который там хранится: LinkNode, HtmlPageNode или CodePageNode.

Правила могут выглядеть следующим образом ...

rules table

Как применить такие правила целостности данных в моей базе данных?


ОБНОВЛЕНИЕ: Что касается этой конструкции с одним столом ...

Я все еще пытаюсь сосредоточиться на окончательной архитектуре.

Я изначально начал с множества небольших таблиц с почти нулевыми нулевыми полями.
Какая схема базы данных лучше всего подходит для моей навигации?

И я узнал о свойстве IsDiscriminator LINQ to SQL.
Как лучше всего обрабатывать отношения один-к-одному в SQL?

Но потом я узнал, что LINQ to SQL поддерживает только наследование одной таблицы.
Может ли столбец LINQ to SQL IsDiscriminator НЕ наследоваться?

Теперь я пытаюсь обработать это с помощью коллекции классов и абстрактных классов.
Пожалуйста, помогите мне с моими абстрактными классами .NET.

Ответы [ 11 ]

2 голосов
/ 18 сентября 2008

Лично я всегда настаиваю на том, чтобы код целостности данных помещался в саму таблицу с помощью триггера или ограничения проверки. Причина в том, что вы не можете гарантировать, что только пользовательский интерфейс будет обновлять вставки или удалять записи. Вы также не можете гарантировать, что кто-то может не написать второй sp, чтобы обойти ограничения в оригинальном sp, не понимая фактических правил целостности данных, или даже написать это, потому что он или она не знают о существовании sp с правилами. На таблицы часто влияют пакеты DTS или служб SSIS, динамические запросы из пользовательского интерфейса или через анализатор запросов или окно запросов, или даже запланированные задания, выполняющие код. Если вы не поместите код целостности данных на уровне таблицы, рано или поздно ваши данные не будут иметь целостности.

2 голосов
/ 17 сентября 2008

Вы можете установить триггеры вставки / обновления . Просто проверьте, являются ли эти поля null или notnull , и при необходимости отклоните операцию вставки / обновления. Это хорошее решение, если вы хотите сохранить все данные в одной таблице.

Вы можете также создать уникальную таблицу для каждого класса .

2 голосов
/ 17 сентября 2008

Использовать ограничения CHECK для таблицы. Они позволяют использовать любой тип логической логики (в том числе для других значений в таблице), чтобы разрешить / отклонить данные.

С Books Online сайта:

Вы можете создать ограничение CHECK с помощью любое логическое (логическое) выражение, которое возвращает TRUE или FALSE на основе логические операторы. За предыдущий Например, логическое выражение: зарплата> = 15000 И зарплата <= 100000. </p>

2 голосов
/ 17 сентября 2008

Похоже, вы пытаетесь использовать шаблон Single Table Inheritance , это шаблон, описанный в разделе "Объектно-реляционные структурные шаблоны" книги Шаблоны архитектуры корпоративных приложений .

Я бы рекомендовал шаблоны Наследование таблиц классов или Наследование бетонных таблиц , если вы хотите обеспечить целостность данных с помощью ограничений таблицы SQL.

Хотя это не было бы моим первым предложением, вы все равно могли бы использовать наследование одной таблицы и просто применять ограничения с помощью хранимой процедуры.

2 голосов
/ 17 сентября 2008

Иметь уникальную таблицу для каждого типа узла.

Почему бы просто не заставить создаваемый класс обеспечивать целостность данных для своего собственного типа?


EDIT

В этом случае вы можете либо a) использовать логические ограничения (см. Ниже), либо b) хранимые процедуры, чтобы выполнять вставки / изменения (хорошая идея независимо от того, что это), либо c) снова, просто заставьте класс обеспечивать целостность данных. *

Смесь C & B будет ходом событий, которые я беру. Я хотел бы иметь уникальные хранимые процедуры для добавления / редактирования для каждого типа узла (т. Е. Insert_Update_NodeType), а также заставить класс выполнять проверку данных перед сохранением данных.

1 голос
/ 30 августа 2018

Обеспечение целостности данных в базах данных По существу, существует четыре основных типа целостности данных: сущность, домен, ссылочная и пользовательская.

Целостность сущности применяется на уровне строк; целостность домена применяется на уровне столбцов, а ссылочная целостность применяется на уровне таблиц.

  1. Целостность объекта гарантирует, что таблица не содержит повторяющихся строк и уникально идентифицируется.

  2. Целостность домена требует, чтобы набор значений данных находился в определенном диапазоне (домене), чтобы быть действительным. Другими словами, целостность домена определяет допустимые записи для данного столбца, ограничивая тип данных, формат или диапазон возможных значений.

  3. Ссылочная целостность связана с сохранением синхронизации между таблицами.

@ Зак: Вы также можете зайти в этот блог, чтобы прочитать более подробную информацию о соблюдении целостности данных, здесь- https://www.bugraptors.com/what-is-data-integrity/

1 голос
/ 17 сентября 2008

Лучший ответ Стивена . Но если вы ДОЛЖНЫ, вы можете добавить проверочное ограничение для столбца HtmlOrCode и других столбцов, которые необходимо изменить.

1 голос
/ 17 сентября 2008

Я не очень знаком с SQL Server, но я знаю, что с Oracle вы можете указать ограничения, которые вы могли бы использовать, чтобы делать то, что вы ищете. Я почти уверен, что вы можете определить ограничения и в SQL-сервере.

РЕДАКТИРОВАТЬ: Я нашел эту ссылку , которая, кажется, содержит много информации, вроде длинной, но может стоить прочитать.

1 голос
/ 17 сентября 2008

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

0 голосов
/ 17 сентября 2008

Вы пробовали NHibernate ? Это гораздо более зрелый продукт, чем Entity Framework. Это бесплатно.

...