Вопрос по адекватности решения в БД

MySQL/PostgreSQL/SQLite/Oracle/M$SQL/....

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Тёмный
проходил мимо

Вопрос по адекватности решения в БД

Непрочитанное сообщение Тёмный » 2013-07-02 13:02:53

Здравствуйте!
Хочу посоветоваться с вами.
В моём проекте имеется необходимость использовать конструкции типа справочник. Поясню:
Есть таблица с книгами и к примеру таблица с авторами

Код: Выделить всё

id int unsigned primary key auto_increment,
bookTypeID  int unsigned not null,
authorID int unsigned not null,
bookName
По хорошему bookTypeID и authorID должны быть внешними ключами на соответствующие таблицы bookTypes и bookAuthors
Но у меня в проекте таких "малозначительных" сущностей получается много. И для них я сделал такое решение:

Код: Выделить всё

sprav
id int unsigned not null primary key auto_increment,
spravKey CHAR(32) NOT NULL UNIQUE

Код: Выделить всё

sprav_data
id int unsigned not null primary key auto_increment,
spravKeyID int unsigned not null,
dataTXT TEXT NOT NULL,
dataSTR CHAR(255) NOT NULL,
dataINT INT NOT NULL
Смысл этих двух таблиц в том, что таблица sprav содержит варианты справочников, к примеру в нашем случае с книгами, она содержит данные:
sprav

Код: Выделить всё

1   book.types
2   book.authors
А поля authorID и bookTypeID в таблице books ссылаются внешним ключом на соответствующие записи в таблице с данными справочников sprav_data
Скажите есть ли резон так делать или надо всё-таки для каждой маломальской сущности плодить таблицу?

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

FiL
ст. лейтенант
Сообщения: 1375
Зарегистрирован: 2010-02-05 0:21:40

Re: Вопрос по адекватности решения в БД

Непрочитанное сообщение FiL » 2013-07-02 15:34:03

Нормальное решение в том плане, что не плодишь разные таблицы. Особенно если количество этих таблиц может поменяться в процессе.
Но таки решение с двумя таблицами не самое лучшее. Все-таки лучше-бы их должно быть 4, мне так кажется.
sprav (id, SpravName, KeyType, ValueType)
Keys (id, KeyName)
Values (id, ValueName)
Data (id, SpravID, KeyID, ValueID)

P.S. Не очень понятно только зачем тебе поле ТЕХТ. Я не знаю задачи, но искать по нему будет грустно.

Тёмный
проходил мимо

Re: Вопрос по адекватности решения в БД

Непрочитанное сообщение Тёмный » 2013-07-02 19:38:27

FiL писал(а):Нормальное решение в том плане, что не плодишь разные таблицы. Особенно если количество этих таблиц может поменяться в процессе.
Но таки решение с двумя таблицами не самое лучшее. Все-таки лучше-бы их должно быть 4, мне так кажется.
sprav (id, SpravName, KeyType, ValueType)
Keys (id, KeyName)
Values (id, ValueName)
Data (id, SpravID, KeyID, ValueID)

P.S. Не очень понятно только зачем тебе поле ТЕХТ. Я не знаю задачи, но искать по нему будет грустно.
Я не очень понял зачем таблицы Keys и Values. И также не понял зачем у таблицы sprav поля KeyType и ValueType
А по поводу поля TEXT, так я же по нему не ищу, а храню в нём просто значение. Когда поиск по нему понадобится, видимо буду учиться организации полнотекстовому поиску в БД.