Какова правильная форма этого реляционного дизайна БД?
Ниже у меня есть две таблицы, Клиент и Валюта.
Сценарий: для каждого клиента должна быть определена одна валюта для всех его транзакций. Я разместил столбец currency_id, который связывает валюту с клиентом. Ниже некоторые вопросы возникают в моей голове. Возможно, это глупый вопрос. Но я хотел бы очистить себя.
Взгляд от клиента: один клиент имеет одну валюту
Вид из валюты: одна валюта может иметь 0 или более клиентов.
Здесь вопрос. В этом типе сценария, как мы должны принять проблему? Мы должны видеть из клиента (1) или из валюты (2). Кто-нибудь может объяснить мне это??
РЕДАКТИРОВАТЬ: Мой вопрос с точки зрения проектирования ERD.
4 ответа
(Вбрасывание этого после голосования @ ответа Гилберта и прочтения последующего обсуждения.)
Связь между двумя таблицами происходит в двух направлениях: таблица X связана с таблицей Y, а таблица Y связана с таблицей X. Для вашего случая это именно так, как вы сказали:
- Один клиент имеет одну валюту
- Одна валюта может иметь 0 или более клиентов
Оба словесных описания верны.
Что касается представления ERD, ваш второй случай лучше всего отражает это. Если вы не академик, не увязайте в репрезентативных подробностях, существуют десятки очень похожих обозначений. Пока это показывает "Один к нулю или больше", вы хороши.
Что касается реализации, я думаю, что вы уже поняли это: родительская таблица имеет Первичный ключ (CurrencyId), дочерняя таблица имеет свой собственный Первичный ключ (CustomerID) и внешний ключ (CurrenctyID), связанный с родительской таблицей.
Мы должны видеть из клиента (1) или из валюты (2).
Вы можете увидеть данные либо с точки зрения клиента, либо с точки зрения валюты.
Вы сказали это сами. Вы можете увидеть валюту для конкретного клиента или подсчитать количество клиентов для конкретной валюты.
Нет никакого "порядка" для прохождения реляционной базы данных. Вы разрабатываете реляционные таблицы, чтобы они предоставляли необходимую вам информацию.
Вы не просматриваете отношения ни с одной стороны. То, что у вас есть, это число от нуля до многих клиентов, относящихся к одной валюте, которые можно выразить графически или в виде текста различными способами. "0..*:1", например.
По условиям ERD 2 это правильно. У вас есть внешний ключ в Customer, ссылающийся на первичный ключ Currency, поэтому у вас есть отношение "многие к одному" от Customer до Currency. 2 правильно показывает это соотношение схематически.