Отношение 1 к 0..1 - куда должен указывать FK?

Скажем, у меня есть таблица клиентов с отношениями 1:0..1 с другой таблицей, обычно у меня был бы Nullable FK в таблице клиентов, указывающий на другую таблицу.

Однако, скажем, количество дополнительных необязательных фрагментов данных, связанных с клиентом, растет, и просто ради аргументов количество таблиц теперь равно 10. Было бы предпочтительнее использовать ту же архитектуру, чтобы в клиенте было 10 дополнительных столбцов. table, все, возможно, нулевые, если не были сохранены дополнительные данные, или лучше, чтобы FK указывал на таблицу клиентов от дочернего элемента? Эта модель кажется более аккуратной, поскольку у меня нет множества столбцов, допускающих значение NULL, и я могу постепенно расширять систему, если это необходимо, просто добавляя новые таблицы и новый столбец FK, указывающий на клиента в новой таблице. Единственным недостатком является то, что кажется (смотря на базу данных), что вы можете добавить больше строк, нарушая правило отношения 1: 0-1. Однако мое приложение все равно никогда не вставит лишнюю строку.

Первый метод требует, чтобы я добавлял новый столбец в конец таблицы клиентов для каждой новой таблицы, добавляемой в систему.

Какой метод лучше в этом случае?


person jaffa    schedule 12.10.2011    source источник
comment
Также см. этот вопрос об отношении: .com/questions/5177991/   -  person Hibou57    schedule 23.08.2013


Ответы (2)


Ответ механически выводится из идеи функциональной зависимости.

Чтобы значение существовало в одном отношении, подразумевается, что значение должно существовать в другом. Когда это верно, будет ограничение внешнего ключа из зависимой таблицы (первой) в независимую таблицу (последнюю).

Другой способ взглянуть на это состоит в том, что отношение «один к одному» на самом деле является частным случаем отношения «один ко многим»; только вместо многих вам разрешено только одно.

в SQL:

CREATE TABLE independent (
    id INTEGER PRIMARY KEY
);

CREATE TABLE dependent (
    independent_id INTEGER UNIQUE NOT NULL FOREIGN KEY REFERENCES independent(id)
);

Как и один ко многим, «многие» имеют внешний ключ к «одному», но чтобы превратить «многие» в «один», просто сделайте его unique. Обычно удобно выразить все это, сделав столбец внешнего ключа в зависимом отношении первичным ключом для этого отношения:

CREATE TABLE dependent (
    independent_id INTEGER PRIMARY KEY FOREIGN KEY REFERENCES independent(id)
);

Правка: я заметил, что ваш заголовок задает вопрос, отличный от вашего основного текста. Вышеизложенное отвечает заголовку.

С точки зрения нормализации базы данных, вероятно, предпочтительнее использовать несколько таблиц, как указано выше, в пользу атрибутов, допускающих значение NULL. Пустые значения - это своего рода нестандартный способ сказать, что значение определенного атрибута является в некотором роде «особым», но на самом деле не требует какой-либо конкретной интерпретации того, что это может означать. Нулевой manager_id, вероятно, означает что-то совершенно отличное от нулевого birthdate, даже если они имеют одинаковую метку.

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

Тем не менее, есть несколько очень реальных практических причин для использования того или другого. Наиболее очевидная причина производительности связана с затратами места на использование того или другого. Когда обычно используется необязательное значение, дополнительное пространство, используемое внешним ключом и соответствующим индексом, не окупается. Точно так же, если необязательное значение используется редко; более компактно поместить эти значения в другое отношение. Наличие атрибута, допускающего значение NULL, заняло бы место в таблице, которое почти никогда не используется.

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

person SingleNegationElimination    schedule 12.10.2011

Частичный ответ:

Имейте в виду, что разделение таблицы на две с отношением 1-1 или 1-0..1 всегда потребует дополнительного соединения между этими таблицами.

Если вам часто нужно возвращать данные из обеих таблиц вместе, и эти таблицы сильно загружены, лучше иметь «тонны значений NULL» в одной большой таблице.

person Frosty Z    schedule 12.10.2011