2013-04-19 3 views
2

Я выхожу, очевидно, в мозг-бурный вопрос. Это, или я просто слишком много noob, чтобы увидеть какие-либо очевидные ответы на него:Трехмерная (или более) система маркировки? Архитектура базы данных PHP/MySQL

Как я могу достичь системы тегов, в которой каждый тег имеет определенное отношение к каждому пользователю веб-сайта?

Очень простой пример того, что я пытаюсь достичь, - это ситуация, когда система отслеживает образы страниц, которые пользователь делает для каждого тега. Например, несколько ключевых слов тегов «помечены» на каждую страницу веб-сайта. На странице об экологической науке могут быть помечены ключевые слова, такие как «биология» и «социология». Когда пользователь А посещает эту страницу, число увеличивается на 1, которое подсчитывается каждый раз, когда Пользователь А просматривает «биологию», а другой подсчитывает «социологию».

Таким образом, мы получаем записи, показывающие, насколько человек любит конкретный тег.

Что было бы самым эффективным способом сделать это с MySQL, и можно ли было бы работать с ним в двухстоечную систему, такую ​​как следующее?

Table 1: Tags 

- tag_title 
- tagged_pages 
- user_likes 

Table 2: Users 

- user_id 

Добавление столбцов таблицы полностью прекрасное. Я пытаюсь избежать дублирования таблицы тегов и всех записей в ней.

Все, что я придумал до сих пор, имеет поле user_likes, которое будет отформатировано примерно так для каждого тега: 101-12, 99-3, 156-14 ... и т. Д. Затем используйте PHP explode(), чтобы отделить user_id от числа понравившихся.

Большое спасибо за ваше творческое понимание!

ответ

2

Никогда не помещайте более одной информации в столбец. Это первое правило нормализации, и вы действительно не должны его нарушать.

Я думаю, что вам нужно еще несколько таблиц, чтобы правильно построить это (и это нормализованы правильно)

users 
    id 
    name 

tags 
    id 
    name 

pages 
    id 

page_tags 
    page_id 
    tag_id 

user_page_hits 
    user_id 
    page_id 
    hits 

Теперь, если вы хотите знать, сколько пользователю нравится определенный тег, вы можете создать VIEW на этих таблицах, как

user_tag_hits 
    as select u.name, t.name, sum(uph.hits) hits from users u 
       join user_page_hits uph on uph.user_id = u.id 
       join page_tags pt on pt.page_id = uph.page_id 
       join tags t on t.id = pt.tag_id 
       group by u.name, t.name 

, которые дадут результаты, как

username tagname hits 
me tag1 112 
me tag2 112 
me tag3 70 
me tag4 4 
me tag5 4 
+0

Но не это создать эксп сколько записей в таблице page_tags? Было бы много повторений как тегов, так и таблиц. Он стал бы более сложным с умениями иметь более сложные отношения между пользователями и тегами, чем просто постраничные образы. Я понимаю, что в ячейке не должно быть более одной информации, но нет ли лучшего способа сделать это? «Трехмерно»? – Patrick

+0

Базы данных были СДЕЛАНЫ, чтобы они могли хранить миллионы и миллиарды данных в таблицах и с многомерными реляционными связями между ними. Это именно то, для чего были созданы эти инструменты. Я имею в виду, даже если вы говорите о миллиарде записей, каждый из них чрезвычайно мал. Два целых числа, это 64 бит пространства. Время в миллиард, вы получаете около 7 TiB данных, что на самом деле не так уж и много в наши дни. И при правильном индексировании вы, вероятно, не почувствуете разницы в скорости при запросе 100 записей по сравнению с 1.000.000 записей. –