@focus-wtf

Архитектура базы данных как сделать лучше?

Сейчас пишу приложение, где используется MySQL.
Имеются таблицы:

Таблица: ad_table
Поле: ad_id
Поле: image

Таблица: options
Поле: opt_id
Поле: opt_name
Поле: opt_value

В таблицу ad_table в поле image добавляются захешированные названия картинок через запятую:
5711c0e7a3c6b0de576cc8077e2f3e0e.png,
f1b3ec0cc3e96f05721b3d5f565d8fc0.png


В таблицу option добавляются в поле opt_name - название какой-либо опции, например: цвет, в поле opt_value значение этого цвета, например: красный, зеленый, синий. тоже через запятую.
красный, синий, зеленый


Теперь вопрос:
Чем плох такой способ хранения данных? Многие пишут, что это ненормальное использование реляционной бд, где нормализация и все остальные дела. Где EAV?
Стоит ли продолжать хранить данные таким способом, или разделить на несколько таблиц?
Если оно так, то поправьте меня, если я сделал неправильную архитектуру:

option - хранит в себе связь между
id
name_id - id названия опции
value_id - id значения опции

option_name
id
name - название

option_value
id
value - значение

Если таким образом разделить на таблицы, то при добавлении опции придется делать 3 запроса или громоздить join что меня не радует.
Например, сначала добавляется в таблицу option_name название опции, (нужно получить id последнего добавленного имени, чтобы записать потом его в таблицу option?), потом записывается значение в таблицу option_value (снова нужно последний id добавленного, что меня не радует!), полученные идишники названия и значений записываем в таблицу option.
Насколько правильно такое решение?
  • Вопрос задан
  • 486 просмотров
Пригласить эксперта
Ответы на вопрос 4
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
В целом, 1-й вариант - годный.
Только добавьте в таблицу options: ad_id (если я правильно понял, это опции рекламного блока, верно?)
Ответ написан
sim3x
@sim3x
Почитай про нормальные формы, поищи примеры, попроси преподавателя тебе обьяснить на пальцах

По НФБК

ad:
  id - PK
  ...

ad_image:
  id - PK
  ad - FK(ad) 
  image_name - TEXT

option:
  id - PK
  name - TEXT

ad_option_value
  id -PK
  ad_id - FK(ad)
  option_id - FK(option)
  option_value - TEXT
Ответ написан
Комментировать
multed
@multed
сисадмин, блогер, исследователь
а можно использовать MongoDB и все параметры со свойствами хранить в одном документе (строке). без JOIN'ов и нормализации (почти). Конечно, со своими подводными камнями.
Ответ написан
Комментировать
@art_karetnikov
Лучший мой проект: Мобильный банк Сбербанка РФ.
хранить в полях значения через запятую и парсить их налету - суть устилание пола граблями. Добавьте таких строк пару миллионов и попробуйте сделать выборку. Даже объяснять ничего не надо будет, грабли сами прилетят и все растолкуют.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы