ФорумРазработкаБазы данных → Пара вопросов по проектированию БД

Пара вопросов по проектированию БД

  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 29 ноября 2008 г. 3:45

    1. У нас есть определенные элементы, к которым нужны метки (теги). Пусть это будут, скажем, сообщения.

    Таблица сообщений:
    message_id | |message_author | message_text |


    Таблица тегов:
    tag_id | tag_name |


    Таблица связей:
    id | tag_id | message_id |


    Хочу реализовать такую фишку, как релевантность тегов. То есть, один человек напишет метку «пыха», а другой — «pyha». Нужно, чтобы при просмотре сообщений по одному из этих тегов выводились сообщения, которые относятся также и ко второму (третьему, десятому) тегу. «Релевантность», естественно, назначается вручную админом.

    Вопрос — как это реализовать на уровне БД?

    Мой вариант — еще одна таблица для релевантности:
    id | main_tag_id | related_tag_id |


    Но, мне кажется, при большом количестве релевантных тегов начнутся проблемы с выборкой, ведь можно отнести тег B как релевантный А, а тег С — как релевантный B, но для А он же тоже релевантный!

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

    Вопрос — нужно ли две таблицы — одну для присланных, вторую для утвержденных, или достаточно одной таблицы с полем `approved`?

    Мой вариант — да, нужно, потому что это почти что разные сущности, кроме того, для выборки лучше тянуть из таблицы утвержденных без всяких условий, чем тянуть из общей таблицы WHERE `approved`=1.
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 29 ноября 2008 г. 4:16, спустя 31 минуту 24 секунды

    имхо проще сделать в табличке тагс поле visible и если админ составляет релевантные теги(пыха => pyha) то добавлять просто еще один тег с visible =0. выборки будут сложнее на условие visible=1 и все :) да и идея простая.
    Сапожник без сапог
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 29 ноября 2008 г. 4:24, спустя 8 минут 4 секунды

    message_id | message_author | message_text
    1                  | sap                      | Пыха рулит
    2                  | md5                     | Сиськи!!!11адынадын
    3                  | phpdude              | хуй

    tag_id | tag_name | visible
    1         | пыха         | 1
    2         | ПЫХА!!!!   | 0
    3         | pyha         | 0

    id | tag_id | message_id
    1  | 1         | 1
    2  | 2         | 2
    3  | 3         | 3

    И что, как мне по тегу «пыху» вытянуть мессаги и по тегам «ПЫХА!!!!» и «pyha»?
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 29 ноября 2008 г. 4:36, спустя 11 минут 42 секунды

    ну смотри я так понимаю что у тебя есть таблица tags_relations
    tag relation
    пыха pyha
    пыха ПЫХА!!!!
    пыха пиздец
    эту таблиу заполняет админ. (ну или с премодерацией там .. как угодно)

    выборка
    select relation from tags_relations where tag=пыха

    select * from tags where tag in (тут результаты прошлого)
    select * from messages where tag in(tags.ids-результаты)

    просто я имею ввиду навешивать эти теги на статьи, но не показывать их пользователю :) поиски производить по ним, а вот "теги" на странице показывать теги статьи у которых tags.visible=1
    Сапожник без сапог
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 29 ноября 2008 г. 4:36, спустя 17 секунд

    надеюсь правильно выразился, состояние как пьяный какой то)
    Сапожник без сапог
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 29 ноября 2008 г. 4:44, спустя 7 минут 34 секунды

    Да, я понял, проблема в одном. Вдруг админ тоже будет пьяный какой-то и вместо:

    tag relation
    пыха pyha
    пыха ПЫХА!!!!
    пыха пиздец


    возьмет и сделает:

    tag relation
    пыха pyha
    pyha ПЫХА!!!!
    ПЫХА!!!! пиздец


    Что тогда?
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 29 ноября 2008 г. 4:45, спустя 1 минуту 24 секунды

    аа тебе множественные связи хочется? чтобы грубо говоря "наследование"?))
    Сапожник без сапог
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 29 ноября 2008 г. 4:50, спустя 4 минуты 51 секунду

    Ну видимо типа того :)
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 29 ноября 2008 г. 4:54, спустя 3 минуты 29 секунд

    ну смотри на этапе заполнения этой таблицы я думаю что стоит закешировать данные, то есть проследить всю цепочку :) и добавить нужные узлы в таблицу релейшнс.

    PS:// мб конечно я бред несу, но надеюсь есть здравый смысл)) чисто теоретически тяжело рассуждать как будет более правильно. мб можно обойтись вообще одной таблицей как нить в ней изъебнуться и все)))
    Сапожник без сапог
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 29 ноября 2008 г. 5:07, спустя 13 минут 36 секунд


    message_id | message_author | message_text
    1                  | sap                      | Пыха рулит
    2                  | md5                     | Сиськи!!!11адынадын
    3                  | phpdude              | хуй

    tag_id | tag_name | visible
    1         | пыха         | 1
    2         | ПЫХА!!!!   | 0
    3         | pyha         | 0

    id | tag_id | message_id
    1  | 1         | 1
    2  | 2         | 2
    3  | 3         | 3



    Чето я не совсем понимаю в чем проблемма.
    Вы хотите указать что 1 тег является синонимом другого?
    тогда создайте  visible только назовите по другому =) и у всех синонимов туже цифру пишите

    а потом берем нужный тег, смотрим какой у него visible и из базы все теги с таким же visible выбираем.
    Не ругайте меня если че то не понял =)
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 29 ноября 2008 г. 5:09, спустя 2 минуты 1 секунду

    Professor, ну я это же прибл и хотел сказать, только там еще шла речь про добавление удаление синонимов :) поэтому появились доп таблицы.
    Сапожник без сапог
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 29 ноября 2008 г. 5:14, спустя 5 минут 17 секунд


    Professor, ну я это же прибл и хотел сказать, только там еще шла речь про добавление удаление синонимов :) поэтому появились доп таблицы.

    Не вижу проблем,
    добавляем слово "План" с visible=0 и оно автоматом становится синонимом всех слов с  visible=0 .
    Изменяем у "Пыха!!!" visible на другое значение и нет у него синонимов
  • sap

    Сообщения: 2701 Репутация: N Группа: Кто попало

    Spritz 29 ноября 2008 г. 5:16, спустя 1 минуту 48 секунд

    Оно не должно быть синонимом ВСЕХ слов с визибле=0, а только тех, которых нужно. В основном понял как делать.

    Еще есть второй вопрос! =)
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 29 ноября 2008 г. 5:18, спустя 1 минуту 54 секунды

    Оно не должно быть синонимом ВСЕХ слов с визибле=0, а только тех, которых нужно. В основном понял как делать.

    ты не совсем понял
    визибле одинаковое только у тех укоторых нужно.
    оно имеет множество значений не только 1 и 0,
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 29 ноября 2008 г. 5:20, спустя 2 минуты 21 секунду

    В общем, админ выбирает слова которые одинаковы по сути pyha и пыха и ставит визибле=12
    у sex и секс ставит визибле=113.
    Естественно цифра ставится автоматом, он просто вводит слова.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!