1

У меня есть stucture данных, который имеет следующие таблицыбазы данных Нормализация и структура

Customers 
Transactions (Type A) 
Transactions (Type B) 

Мы добавляем Comments таблицу

Customers имеют еще один более Transactions A и Transactions B Comments может быть связано либо Transactions или Customer

У нас внутренняя дискуссия по базе данных формат.

Одна сторона хочет создать таблицу комментариев и 3 кросс-таблицы. Одна сторона хочет создать таблицу комментариев с внешним ключом для клиента и 2 ключа с нулевым значением для транзакций.

Есть ли правило нормальной формы, которое говорит, что один лучше другого? Есть ли консенсус?

EDIT:

Другие ответы и особенности

  • Комментарии никогда не будет ассоциироваться с более чем одного клиента
  • Комментарии никогда не будет связан с более чем одной транзакции
  • Комментарии будут только когда-либо быть связанными с транзакцией A, транзакцией B или ни с одной; но никогда оба
  • Клиентов и операции могут быть 0 или больше комментариев
+0

Я голосую за «... создаю таблицу комментариев с внешним ключом для клиента и 2 ключа с нулевым значением для транзакций». IMHO ... PS: Есть ли вероятность того, что комбинация ID транзакции + Дата транзакции (например) будет уникальной в общесистемной? Некоторый «комбинированный внешний ключ», который однозначно идентифицировал транзакцию (независимо от типа a или типа b), был бы идеальным решением. – paulsm4

+2

Дополнительная информация была бы полезна. Является ли законным для комментария быть связанным с несколькими клиентами или несколькими транзакциями одного типа (A или B)? Является ли законным для комментария быть связанным с клиентом, транзакцией A и транзакцией B? Требуется ли для комментариев иметь какое-либо из этих отношений? –

ответ

0

Наиболее важными нормальных форм (1NF-6NF, BCNF и производные) не позволяют обнуляет в таблицах, поскольку все они основаны только на отношения со значениями, а не нулями. Более полезным является принцип проектирования, называемый Принципом ортогонального проектирования, который указывает, что кортежи с одинаковыми атрибутами не должны отображаться в нескольких местах в вашей схеме. Кажется вероятным, что ваши две таблицы транзакций и комментарии в нескольких местах нарушат это правило ортогонального дизайна.

Вы можете создать родительскую таблицу транзакций, которая объединяет общие атрибуты ваших двух таблиц транзакций, включая атрибут comment (шаблон супертипа/подтипа).

+0

Две транзакции полностью уникальны. Итак, ваш голос за одну таблицу комментариев и перекрестные таблицы для каждой транзакции и клиента? –

+0

Они не являются «уникальными», если они будут делиться одними и теми же атрибутами - они перекрываются. Обычно лучше избегать таблиц с перекрывающимися наборами атрибутов. * Одна таблица *, связывающая комментарий с идентификатором транзакции, должна делать это и избегать необходимости в нескольких столбцах с возможностью NULL. – sqlvogel