2016-04-04 6 views
0

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

Person 
-------- 
id 
firstname 
lastname 
mail 
birthday 
[etc.] 

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

Tattoo 
-------- 
id 
fk_person 
size 
position 
[etc.] 

Теперь tattoo является не только новая таблица Я хотел бы добавить, есть и другие, для волос, пирсинг , музыка вкуса и так далее.

Так что теперь, чтобы добраться до вопроса: Не было бы хорошей идеей магазине все, что данные в одном Tag таблице как это:

Tag 
-------- 
id 
tag_name 
tag_value 

Там я мог бы добавить такие данные:

1 | tattoo_size | large 
2 | tattoo_size | medium 
3 | tattoo_size | small 
4 | firstname | Peter 
5 | nickname | Pete 
7 | birthday | 11.11.1999 

Плюс n-to-n-table Person до Tag.

id 
fk_person 
fk_tag 

С данными, как это:

1 | 25 | 1 
2 | 25 | 4 
3 | 23 | 1 

Таким образом, не существует дублирования информации, если два человека имеют большую татуировку или ПгвЬЫат Питер, например, и люди могут иметь много татуировок, как они хотят.

Дополнительный бонус это, кажется, приносит что поиск будет легче: Вам просто нужно запустить SELECT на Tag столе с ключевым словом.

Я использую MySQL и PHP в случае, если это имеет значение.

Хорошая идея? Плохая идея? Получил лучшую идею?

Благодаря

+0

Я добавил «Тег» на ваш вопрос. Ищите другие вопросы. Я устал проговариваться с EAV. –

ответ

1

Если вам нужно, чтобы иметь возможность запросить такие вещи, как «все люди с татуировками и пирсингом», то вы должны структурировать это как многие-ко-многим между людьми и тегами. Вы можете проставлять ваши теги в виде столбца в таблице тегов, например category='body',name='piercing', or you can bake that information into the tag itself, like body.piercing`, если вы можете сохранить именование достаточно простым, чтобы избежать потенциального конфликта с вашим разделителем.

Если вам не нужно запрашивать эти вещи в совокупности, просто используйте JSON column и сохраните свои данные там. У вас есть тонкость гибкости в отношении того, как вы организуете это, не создавая много-много таблиц.

Риск здесь создания структуры, которая является слишком общей, оставит вас с действительно дерьмовым хранилищем документов. Если вы идете по этой дороге, оцените решения, например, MongoDB.

Смежные вопросы