Базовый дизайн стола Q - PullRequest
       11

Базовый дизайн стола Q

1 голос
/ 10 октября 2010

Я пытаюсь понять эту концепцию.Например: у меня есть две таблицы «Город» и «Страна».

Country
-------
id  
abbreviation   
name   


City
-----
id   
name   
Country (name or id, or both? - This is the question)

Чтобы сослаться на определенный город и синхронизировать его со страной, к которой он принадлежит, я думаю, это будет ссылка на country.id как FK.Это означает, что примером таблицы городов будет: (200, Нью-Йорк, 19) - где 19 = США в таблице стран.Но это не помогает человеку, просматривающему стол, потому что он не знает, что такое 19, не глядя в таблице стран, что такое 19.

Так что я хочу добавить название страны также в таблицу городов, чтобы она гласила:(200, Нью-Йорк, США).Мне не нужно 19 для отображения, потому что 19 бесполезен для читателя, но используется только для подключения таблиц обратно.

Так, как должны выглядеть столбцы / FK моих таблиц, которые я могу хранить вСтроки таблицы городов, подобные этой (200, Нью-Йорк, США), гарантируют, что Нью-Йорк всегда будет ссылаться на США при поиске в США, и оставит 19, который является основным ключом для США, вне таблицы городов, чтобы таблицы выглядели чистыми и легкимичтобы понять?И я предполагаю, что если на них есть ссылки, завтра, если я обновлю США до 20, они будут обновляться в таблице городов самостоятельно, и таким же образом, если я переименую США в США, они обновятся в таблице городов самостоятельно?

  • Моя БД находится в MySQL

Ответы [ 3 ]

1 голос
/ 10 октября 2010

Почему бы не использовать коды стран ISO 3166 (2 символа или 3 символа) в качестве идентификатора страны?Это оставляет вас с узнаваемыми кодами в таблице города;вы можете отобразить полное имя в таблице стран.

Что касается просмотра данных, используйте VIEW для создания хорошо выглядящей таблицы:

CREATE VIEW CityInfo(CityID, CityName, CountryID, CountryName) AS
    SELECT ci.id, ci.name, ci.country, co.name
      FROM City AS ci JOIN Country AS co ON ci.Country = co.id;
0 голосов
/ 10 октября 2010

Таблицы не должны просматриваться людьми: какое-то приложение должно иметь доступ к таблицам, чтобы представлять данные людям таким образом, чтобы они могли их анализировать. Причина, по которой вы хотите, чтобы country.id был FK в вашей таблице, заключается в том, что у вас нет миллиона строк с именем страны «США», потому что тогда могут возникнуть всевозможные проблемы, например, что происходит, когда вы вводите неверный тип «США А» приземляется на одном из полей? Или что, если вы хотите изменить то, что пользователь видит с «США» на «США»?

Правильный способ справиться с этим - использовать country.id, как вы изначально предлагаете, а затем использовать оператор JOIN для представления данных, например:

SELECT city.name, country.name
  FROM city JOIN country ON country.id = city.country

Мой синтаксис может быть отключен, но это по сути то, что вы хотите.

0 голосов
/ 10 октября 2010

Вы не ... если вам нужно иметь «используемые» таблицы в БД, чтобы кто-то мог легко просмотреть что-то полезное с помощью select * и т. Д. (Или чтобы упростить программирование SQL вручную).Затем вы создаете таблицы, как указано выше, в обычной форме, а затем создаете VIEW, который объединяет таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...