С нами с 01.04.07
Сообщения: 4378
Рейтинг: 2970
|
Добавлено: 20/01/10 в 19:16 |
Подскажите, пожалуйста, как лучше.
1 вариант: 1 таблица, поля - ИД объекта (к которому теги), сам тег текстом
2 вариант: 2 таблицы, 1ая - уник ИД, тег текстом (уникальный); 2ая таблица - ИД объекта, ИД тега из 1ой
Какой вариант выбрать?
Спасибо.
|
|
|
|
С нами с 10.12.03
Сообщения: 1615
Рейтинг: 870
|
Добавлено: 20/01/10 в 19:26 |
я выбрал 2й вариант, но у меня десятки миллионов записей.
если записей 10-100к - лучше вариант 1
ps: все поля нужно сделать ключами/индексами, текстовые в том числе.
|
|
|
|
С нами с 13.04.05
Сообщения: 412
Рейтинг: 332
|
Добавлено: 20/01/10 в 20:27 |
тоже за второй вариант, он производительнее при большом количестве записей
|
|
Если есть что сюда написать - пишите, подумаем
|
8
|
|
|
С нами с 13.01.10
Сообщения: 84
Рейтинг: 72
|
Добавлено: 20/01/10 в 20:36 |
второй вариант надо делать только насколько я знаю, это принцип релевантых баз данных
|
|
|
|
Чингачгук, вождь красноглазых
С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824
|
Добавлено: 20/01/10 в 20:52 |
Второй. Это и есть "нормализация"
|
|
|
|
С нами с 01.04.07
Сообщения: 4378
Рейтинг: 2970
|
Добавлено: 20/01/10 в 20:58 |
Смотрел 5 опенсорс проектов 2.0, типа дигг, во всех реализован 1ый вариант. Второй видел только один раз, и то этот скрипт найти у себя не могу.
|
|
|
|
Чингачгук, вождь красноглазых
С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824
|
Добавлено: 20/01/10 в 21:06 |
gimcnuk писал: | Смотрел 5 опенсорс проектов 2.0, типа дигг, во всех реализован 1ый вариант. Второй видел только один раз, и то этот скрипт найти у себя не могу. |
А ты бы смотрел нормальный оупенсорс проект, который инженеры грамотные делали. Тот же hibernate.
|
|
|
|
programmer
С нами с 08.12.02
Сообщения: 7613
Рейтинг: 5760
|
Добавлено: 20/01/10 в 22:19 |
2 вариант
универсальнее
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 20/01/10 в 22:37 |
Второй вариант теоретически более правильный.
А в конечном результате все равно от задачи будет зависеть. К примеру вариант 1, на поле с тегами кидаем full-text search индекс, и в результате по тегам ищем простым селектом, а не с нескольких таблиц. Ну а теги скажем отрабатываются ночью по крону, где вся их карта и статистика будет секунд за 5-10 сделана.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
8
|
|
|
С нами с 10.12.03
Сообщения: 1615
Рейтинг: 870
|
Добавлено: 20/01/10 в 22:38 |
здесь ничего не нужно смотреть, нужно просто подумать - что лучше для СУБД, делать выборку по целочисленному ключу или по строковой константе.
бОльшая часть запросов в варианте "2" сводится к 2м запросам, вместо одного (в варианте /1/). Но оба запроса будут выборкой по INT индексу.
Я еще раз скажу - у меня 120 млн записей только в одной таблице, 8 млн во второй и еще 4 млн в третьей - вариант (2) работает моментально.
ps: 2й способ так же решает много проблем, если нужно выводить облако тегов с числом сайтов в каждом из них.
ps2: вариант Stek-a c fulltext поиском не применим для больших объемов данных. Правда, по его словам, сайтов с большими базами почти нет..
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 20/01/10 в 23:22 |
Цитата: | вариант Stek-a c fulltext поиском не применим для больших объемов данных. |
Почему ? Поискал в инете информацию о ограничениях, ничего подобного не нашел. Да и сам mysql позиционирует этот индекс как раз для поиска по тексту.
Зато нашел старенький тест для тегов , там 4 вида реализации тегов с разными тестами быстродействия.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
8
|
|
|
С нами с 10.12.03
Сообщения: 1615
Рейтинг: 870
|
Добавлено: 21/01/10 в 00:00 |
а) потому что размер индекса нужно минимизировать. а fulltext - это худший способ сделать это.
б) использование fulltext индекса для тегов - это все равно что гвозди забивать ноутбуком. сам подумай - нужно ВЕДЬ точное совпадение (без учета регистра). Если уж так хочется - НАМНОГО лучше просто создать индекс по текстовому полю - будет быстрее намного.
в) я вернусь к старой теме - fulltext индекс это атавизм. он в дальнейшем ограничит возможность миграции на другую архитектуру таблиц.
г) статье 5 лет. mysql меняется до неузнаваемости каждый год. я сам люблю всё делать по старинке, но fulltext - это здесь не решение.
д) Назови хоть один крупный проект (с большим объемом хранимых текстовых данных), который использует mysql fulltext индексы?
2Stek: при всём уважении, ты, наверно, просто не подумал, перед тем как написать fulltext. Просто слово "индекс" было бы актуальней. Сам подумай - на то он и fulltext, что бы искать в тексте. А тут - просто совпадение строк нужно реализовать.
|
|
|
|
www.phpdevs.com
С нами с 24.10.02
Сообщения: 16633
Рейтинг: 16105
|
Добавлено: 21/01/10 в 00:17 |
Цитата: | б) использование fulltext индекса для тегов - это все равно что гвозди забивать ноутбуком. сам подумай - нужно ВЕДЬ точное совпадение (без учета регистра). Если уж так хочется - НАМНОГО лучше просто создать индекс по текстовому полю - будет быстрее намного. |
Ну х.з, тут я не согласен. Тэги - это ведь сейчас фактически то, что раньше пихали в meta_keywords. И при начальном наборе тега, часто делается поиск на наличие тегов с таким вхождением.
В общем все равно в конечном варианте будет все от задачи зависеть. И если скажем проект рассчитывается на ну 1к записей, то писать "по правилам" смысла нет, легче дать одно текстовое поле и вперед, хоть в phpmyadmin'е вбивай, решение за 2 минуты.
|
|
Пишу на php/mysql/django за вменяемые деньги.
Обращаться в личку.
|
8
|
|
|
С нами с 10.12.03
Сообщения: 1615
Рейтинг: 870
|
Добавлено: 21/01/10 в 00:20 |
Stek писал: | если скажем проект рассчитывается на ну 1к записей, то писать "по правилам" смысла нет, легче дать одно текстовое поле и вперед, хоть в phpmyadmin'е вбивай, решение за 2 минуты. |
на 100% согласен.
с этого и начинали - если там будет 1к записей - можно сделать и на коленке.
Может ты или я неправильно поняли слово теги. В моём понимании - речь идёт о тегах аля вордпресс. Кликнул ты на тег - а тут тебе список постов, которые были помечены этими тегами. Кликнут на посте - а внизу список тегов, каждый - как ссылка. там совпадение нужно точное, потому я и писал, что fulltext не нужен. Хватит просто сделать кейворд индексным полем.
Если речь идёт просто о строке, где перечисляются кейворды (типа meta keywords) без ссылок каких-то, то я бы это тегами не называл.
|
|
|
|
programmer
С нами с 08.12.02
Сообщения: 7613
Рейтинг: 5760
|
Добавлено: 21/01/10 в 01:15 |
тег это признак.признак характеризующий/объединяющий чего либо
это может быть линком, а может и не быть.
|
|
|
|
С нами с 01.04.07
Сообщения: 4378
Рейтинг: 2970
|
Добавлено: 21/01/10 в 09:03 |
Теги имелись в виду, такие как на тубах, ну или у вордпресса.
Stek: вариант с fulltext это не первый, а третий уже.
Я имел в виду под 1ым - scuttle (собственно, оиз этого скрипта и взял идею), 2ой вариант это toxi
|
|
|
|
С нами с 01.03.07
Сообщения: 304
Рейтинг: 223
|
Добавлено: 21/01/10 в 11:36 |
выбирай второй вариант, если будешь развивать проект этот вариант более универсальнее окажется
|
|
|
|
С нами с 01.04.07
Сообщения: 4378
Рейтинг: 2970
|
Добавлено: 21/01/10 в 12:53 |
Вариант уже выбран, но за дискуссией слежу, может что-то интересное ещё скажут.
|
|
|
|
С нами с 01.02.07
Сообщения: 231
Рейтинг: 294
|
Добавлено: 21/01/10 в 16:38 |
В первом варианте теги придется матчить либо через fulltext индекс что будет работать, но не фонтан, либо через LIKE '%TAG%' что вообще жопа полная )
Так что второй, конечно. Плюс статсы по тегам считать можно будет.
|
|
|
|
« ... full on ... »
С нами с 17.03.07
Сообщения: 670
Рейтинг: 1686
|
Добавлено: 21/01/10 в 19:25 |
2-й вариант. Тот же упомянутый тут вордпресс устроен именно так и не только. Использовать достаточно удобно в сравнении с 1-м вариантом, можно вытаскивать данные и 1 запросом, правда более сложным (т.е. с join).
У меня на нескольких проектах этот вариант отлично работает, правда миллионов записей нет, всего несколько тысяч. В общем, 2-й и логичнее и правильнее с точки зрения теории организации реляционной БД (как раз выше упоминали нормализацию).
|
|
Power of the lime madness...
|
8
|
|
|