За последние 24 часа нас посетили 15660 программистов и 1558 роботов. Сейчас ищут 904 программиста ...

Последовательность значений (что то типа массива) в столбце

Тема в разделе "MySQL", создана пользователем VLK, 15 июн 2015.

  1. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Тема появилась отсюда viewtopic.php?f=13&t=53575 вопрос такой, например есть таблица с тегами (tag_id, tag_name) и мне надо в другой таблице в столбце posts_tag сохранить все tag_id данной записи, что типа:
    что бы потом осуществляя выборку я мог получить все записи в которых присутствую теги 5, 12, 33

    Вопрос может есть какой то тип данных или как лучше организовать хранение подобного, меня бы устроили именно числовые записи.

    Так же меня интересует решение этой задачи в MySQL, без всяких дополнений (типа сфинкса, там то я знаю что можно это решить), конкретной задачи сейчас нет, просто стало интересно исходя из ответа [​IMG]
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Re: Последовательность значений (что то типа массива) в стол

    Ты связь многие-ко-многим сделать хочешь, или что это?
     
  3. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Re: Последовательность значений (что то типа массива) в стол

    Не надо так хранить теги, на первой же выборке будет ой )
     
  4. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Re: Последовательность значений (что то типа массива) в стол

    ну виде обычной строки конечно не надо, оно вроде как и не будет искать даже (я как то делал и там искал через FULLTEXT, там пришлось id с 1000 начинать, т.к. поиск не осуществляется если меньше 4-х символов), вот может есть какой то способ хранения подобного, набора (последовательности) данных.

    Добавлено спустя 1 минуту 40 секунд:
    Re: Последовательность значений (что то типа массива) в столбце
    не совсем понимаю о чем речь, я знаком с таким схемой хранения тегов (и не только) как с WP (3 таблицы, tags, posts и связи между ними) но если осуществлять поиск по тегам, это очень накладно.
     
  5. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Re: Последовательность значений (что то типа массива) в стол

    Что значит накладно? У тебя должно быть три таблицы:
    1. posts - id, title, text
    2. tags - id, title
    3. post_tag - post_id, tag_id
    Берешь тег, получаешь id постов и выводишь.
     
  6. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Re: Последовательность значений (что то типа массива) в стол

    У меня есть три таблицы posts (нас в ней интересует только post_id) tags (нас в ней интересует только tag_id) и term_relationships, которая состоит из id, post_id и tag_id.

    Мы ищем по интересующие нас записи (из таблицы posts) по тегам причем меня интересуют записи где все эти теги присутствуют, т.е. я делаю выборку из tags, получаю интересующие меня tag_id (например 3, 5, 9) и потом я получаю все записи из таблицы term_relationships в которых столбец tag_id равен 3, 5 или 9, полученные результат, допустим 100 000 записей я уже в РНР перебираю, откидываю те записи где не все 3 тега встречаются, как то так.

    как я уже написал 100 000 записей + все это еще перебрать надо, это и есть накладность.

    Добавлено спустя 8 минут 15 секунд:
    Re: Последовательность значений (что то типа массива) в столбце
    таблица term_relationships выглядит так:
    Код (Text):
    1. id | post_id | tag_id
    2. 1  | 1          | 3
    3. 2  | 1          | 5
    4. 3  | 1          | 9
    5. 4  | 2          | 3
    6. 5  | 2          | 9
     
  7. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Re: Последовательность значений (что то типа массива) в стол

    А почему ты решил что это много? Нормально настроенная БД спокойно переживет и в 10 раз больше, к тому же ни кто не отменял кэширование. Вот пых, да, сожрет всю доступную оперативку )

    http://sqlfiddle.com/#!9/6b9f4/1 - мб так?
     
  8. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    Re: Последовательность значений (что то типа массива) в стол

    Возможно топикстартер на подсознании помнит, что аналогичная тема поднималась и я подсказал одному реально толковому товарищу, что имеет смысл хранить теги в строке и есть прецеденты в авторитетных источниках.

    НО! Есть очень важное замечание: это поле не используется для навигации, в нем только хранится контент для отображения. Потому что когда мы выводим список постов, нам не хочется джойнить к нему таблицу-связку и таблицу тегов только ради получения строк с именами тегов. Мы можем хранить эти названия прямо в посте! А вот когда нам понадобится поиск по тегу, тогда мы применим многие ко многим через таблицу-связку.

    Это трюк. В нем возникает потребность только на реально больших числах. Не надо преждевременной оптимизации!
     
  9. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Re: Последовательность значений (что то типа массива) в стол

    уже немного теплее, но не решает проблему, помнится полгода назад у меня была такая проблема, мне надо было организовать поиск по тегам, причем достаточно расширенный поиск, т.е.:
    - я мог выбрать, теги (или тег) должны быть обязательно, желательно и тега не должно быть (не должно быть это так, для формы, оно не использовалось)
    - по мимо это, я еще должен был мочь писать такую штуку в обязательных тегах, что обязательно должен быть тег А или тег Б (если нет ни А ни Б значит мимо, если есть или А или Б значит подходит).

    Записей было много (БД занимала 200 - 500 мб.) (записи - ссылки), сначала я сделал 3 таблицы как у WP (ну или как я приводил выше), тормозило, парой выходил лимит времени, так же была проблема с тем, что я не мог сделать что бы выводилось постранично.
    Потом я все переделал, избавился от таблицы связей, а теги перенес в отдельный столбец, в столбец этот я записывал id тегов из таблицы tags, как я уже говорил сделал так, что бы они начинались с 1000, и записывал так:
    Код (Text):
    1. ,1000,1001,5467,
    а поиск делал при помощи FULLTEXT (а может и нет, уже точно не помню возможно через WHERE LIKE), выполняться стало быстрее, получилось сделать постраничный вывод, но все равно это было не то.

    Сейчас надобности как то нет, но вот интерес как можно было это реализовать правильно только средствами MySQL остался.

    Добавлено спустя 4 минуты 8 секунд:
    Re: Последовательность значений (что то типа массива) в столбце
    единственное я тогда не знал о HAVING, только сейчас узнал.