Что лучше: has_one (таблица с одним столбцом) или строковый столбец? - PullRequest
0 голосов
/ 15 октября 2011

Предположим, у меня есть таблица с именем cities (идентификатор, имя) и другая с именем people (идентификатор, имя, city_id).

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

Является ли сложность , которую я экономлю, лучше, чем гибкость Я теряю?

Являются ли объединения Я экономлю лучше, чем различные я должен использовать?

Установка столбца city в качестве индекса, это будет так же быстро, как поиск ID в другой таблице?

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

Ответы [ 2 ]

1 голос
/ 15 октября 2011

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

Размещение столбца city в таблице people также может замедлить определенные запросы доступа к таблице people.

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

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

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

Ваш дизайнер баз данных, похоже, проделал хорошую работу.

0 голосов
/ 15 октября 2011

Вы всегда можете кэшировать таблицу городов.если вы используете строку, вы теряете ориентацию объекта.Допустим, вы хотите сокращение для городов.или город has_many zip_codes ... или город has_many area_codes.Теперь у вас возникнут проблемы с обновлением приложения.

, вы всегда можете сделать что-то подобное, чтобы потерять дополнительный запрос ...

def city_name
  Rails.cache.fetch("city-#{city_id}-name", :expires_in => 1.days) do
    city.name
  end
end

также вам, вероятно, следует использовать принадлежать_, а не has_one

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