Когда я должен денормализовать данные в MySQL?

0

Я создаю многовалютное приложение.

Рассмотрим таблицу сообщений со следующими полями:

id, country_id, price

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

post->country->currency

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

Должен ли я денормализовать данные и хранить валюту в таблице сообщений?

  • 0
    Каковы ваши столбцы таблицы точно? Каковы ваши FDs? Без этого мы не можем обсуждать нормализацию или денормализацию. В любом случае нормализация просто устраняет аномалии и сложность обновления, которые снова вносит денормализация. Как и во всех компромиссных решениях по оптимизации / разработке, вам необходимо оценить / измерить с учетом ваших собственных обстоятельств. Альтернатива 5NF - как вы должны знать - это правильно управлять обновлениями и ограничениями - однако вы готовы это сделать. Как вы ожидаете от нас выбора между этими двумя вариантами для вас? (Даже если вы сообщили подробности того, как вы справились с денормализованным делом.)
  • 0
    @philipxy спасибо! Это скорее гипотетический вопрос; Я пока не могу опубликовать балансовую единицу или изменить структуру базы данных, но мне было интересно, что делать в таких ситуациях ...
Теги:
database
database-design
relational-database

1 ответ

0

Это зависит от.

Если price будет заморожена во время продажи? (Я так думаю.) Не нормализуйтесь.

Или вам нужно конвертировать цену на основе текущего обменного курса? Нормализуйте.

Кроме того, country_id не является надлежащим ключом для currency. Значение currency_id должно быть определено в момент публикации; сохраните country_id если вам это нужно.

Затем, когда валюта девальвирована или страна переходит к евро, или..., схема не мешает вам.

Кроме того, бывают случаи, когда туристическая зона вполне готова брать наличные деньги в разных валютах. Многие журналы в США перечисляют цену как в долларах США, так и в канадских долларах.

Нормировка:

  • Некоторое "имя" или "адрес", скорее всего, изменится в будущем. Так что нормализовать его в другую таблицу. В противном случае, когда произойдет изменение, вам необходимо выполнить несколько строк в нескольких таблицах, чтобы выполнить изменение.
  • Сохранение пространства... У вас есть строка, которая встречается часто, но (пусть) вряд ли когда-либо изменится. "Нормализуя" (неправильный термин, но аналогичную реализацию), вы можете иметь длинную строку только в одном месте. Он заменяется, скажем, 2-байтовым SMALLINT UNSIGNED допускающим до SMALLINT UNSIGNED различных значений. Внимание: если строка коротка, например, стандартные 2-буквенные country_codes, не беспокойтесь о нормализации. 5-символьный zipcode вряд ли стоит сжиматься до 2-байтового маленького шрифта. коды валют имеют хороший стандарт (доллары США, EUR - только 3 буквы), слишком короткие, чтобы нормализовать нормализацию.

Итак, нормализуйте, если это применимо. По моему опыту, "цена" не относится ни к одной из категорий. А также

  • 0
    Великолепные моменты. Я просто наткнулся на другой случай, когда у меня есть стол с книгами, и на каждой странице книги может быть заметка. Нормализовано, я должен был бы иметь таблицу, содержащую строку для каждой страницы книги (400+), которая затем была бы связана с третьей таблицей, содержащей примечания, которая, хотя и была бы нормализована, кажется чрезмерной ... Любые идеи по Как это выглядит с точки зрения производительности в долгосрочной перспективе?
  • 0
    @ Михал я добавил в свой ответ. Возможно, мое основное недовольство - это то, что вы приравниваете «страну» к «валюте». Цена указана в валюте, а не в стране. Если вы хотите продать одну и ту же вещь по разной цене в разных странах, тогда цена связана с двумя вещами - валютой и местом продаж. Это все еще не поддается "стране -> валюте".
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню