Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Многие ко многим ко многим 
:(
    Опции темы
SwordOfDeath
  Дата 29.9.2011, 04:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Привет,

Хочу реализовать систему подписок(subscription). Но как-то не влазит мне в голову структура БД. У меня получается связь многие ко многим ко многим. Приведу пример:
Код
Пользователи(*)<---->(1)Подписки(1)<---->(*)Встречи
                                   <---->(*)Посты(комментарии к постам)
                                   <---->(*)...
                                   <---->(*)N


Грубо говоря можешь подписаться (и отписаться) на что-угодно... Как это Реализовать...?
Система подписок одна и та же... Не хотелось бы плодить кучу таблиц с подписками на разный контент.

Ну и самое главное как потом получить список всего на что подписался и список всех подписчиков. 

Первая мысль это добавить в таблицу Подписок поле определяющее тип контента... но как тогда получать список всех подписчиков и пописок...  smile 

Это сообщение отредактировал(а) SwordOfDeath - 29.9.2011, 04:49
PM MAIL   Вверх
Akina
Дата 29.9.2011, 07:43 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Таблица подписок.
Таблица подписчиков.
Таблица связи подписчик-подписка.
Это ж классика...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
SwordOfDeath
Дата 29.9.2011, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Привет Akina,
Помню ты мне уже разок помогал здесь, респект и уважуха. 

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

Чувствую себя как-то не очень, вродь простая задачка но нет у меня в голове понимания... =\

Это сообщение отредактировал(а) SwordOfDeath - 29.9.2011, 16:18
PM MAIL   Вверх
Akina
Дата 29.9.2011, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



SwordOfDeath, ну и что? всё равно у тебя две сущности - "тот, кто может подписаться" и "то, на что можно подписаться".

Другое дело, что вторая из этих сущностей многолика. Вот как ты с ней будешь выворачиваться - это вопрос. Есть два принципиальных варианта. Первый - одна таблица, в которой лежат все атрибуты всех вариаций, и, соответственно, там есть все поля атрибутов, которые есть у хотя бы одного из подвидов. Второй - одна таблица, в которой лежат все вариации, но только те поля атрибутов, которые есть у всезх вариаций, плюс ссылки на частные таблицы дополнений в зависимости от типа и особенностей конкретной вариации. Но это не имеет никакого отношения к рассматриваемому вопросу - организации связи.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
SwordOfDeath
Дата 29.9.2011, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Вот как раз об этом извороте и спрашивал... И для меня вопрос именно в этом... Как построить базу так чтобы с такой связью (Многие ко Множеству Множеств) можно было относительно дешево получать список подписчиков и подписок. 

Вот пока я придумал что-то вроде поля в таблице подписок которое указывает на таблицу в которой находится подписываемый объект. Но не представляю как построить соответствующие запросы. это поле что-то вроде ссылки на таблицу но как это реализовать в MySQL, или в какой-то другой СУБД. Да так чтобы работало в обе стороны от подписываемого объекта до подписчиков и от подписчика ко всем подписываемым объектам.
PM MAIL   Вверх
Akina
Дата 29.9.2011, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 13
Всего: 454



Цитата(SwordOfDeath @  29.9.2011,  17:38 Найти цитируемый пост)
пока я придумал что-то вроде поля в таблице подписок которое указывает на таблицу в которой находится подписываемый объект.

То есть вариант номер два.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
SwordOfDeath
Дата 29.9.2011, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Да.
PM MAIL   Вверх
SwordOfDeath
Дата 29.9.2011, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 130
Регистрация: 16.10.2007

Репутация: нет
Всего: нет



Вот! Нашел в одной из ORM описание того что мне нужно
Strategy Pattern

А как оно там заворачивается на базу данных хрен его знает =\
PM MAIL   Вверх
tishaishii
Дата 29.10.2011, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Создатель
***


Профиль
Группа: Завсегдатай
Сообщений: 1262
Регистрация: 14.2.2006
Где: Москва

Репутация: 1
Всего: 8



Схема такая:
Код
user(id); -- пользователь
service(id); -- услуга
service_field(service:service, name, value); -- поля услуги
subscription(user:user, service:service); -- подписка

pk(user.id);
pk(service.id);
pk(service_field.service.id, service_field.name);
pk(subscription.user.id, subscription.service.id);

sa_user(): user.*; -- пользователи
sa_service(): service.*; -- услуги
sa_subscription(?in_uid): -- подписки пользователя
    subscription[uid=?in_uid].*;

sa_service_field(?in_sid): -- поля услуги
    service_field[id=?in_sid].*;

s_service(?in_sid, ?in_field1, ?in_value1, ?in_field2, ?in_value2): -- поиск по полям услуги
    service_field[sid=?in_sid, name=?in_field1, value=?in_value1].*,
    service_field[sid=?in_sid, name=?in_field2, value=?in_value2].*;


Для поиска по полям услуги проще применить набор триггеров и полнотекстовый поиск.

Это сообщение отредактировал(а) tishaishii - 29.10.2011, 14:05
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Общие вопросы по базам данных"
LSD
Zloxa

Данный форум предназначен для обсуждения вопросов о базах данных не попадающих под тематику других форумов:

  • вопросам по СУБД для которых нет отдельных подфорумов
  • вопросам которые затрагивают несколько разных СУБД (например проблема выбора)
  • инструменты для работы с СУБД
  • вопросы проектирования БД
  • теоретически вопросы о СУБД

Данный форум не предназначен для:

  • вопросов о поиске разлиных БД (если не понимаете чем БД отличается от СУБД то: а) вам не сюда; б) Google в помощь)
  • обсуждения проблем с доступом к СУБД из различных ЯП (для этого есть соответсвующие форумы по каждому ЯП)
  • обсуждения проблем с написание SQL запросов, для этого есть форум Составление SQL-запросов
  • просьб о написании курсовой, реферата и т.п., для этого есть Центр помощи или фриланс биржа
  • объявлений о найме специалистов, для этого есть раздел Объявления о найме специалистов

Если вы не соблюдаете эти правила, не удивляйтесь потом не найдя свою тему/сообщение. ;)


Полезные советы:

При написании сообщения постарайтесь дать теме максимально понятное название. В теме максимально подробно опишите проблему. Если применимо укажите: название базы данных и версии (MySQL 4.1, MS SQL Server 2000 и т.п.); используемых язык программирования; способа доступа (ADO, BDE и т.д.); сообщения об ошибках.

Для вставки кода используйте теги [code=sql] [/code].

Литературу по базам данных можно поискать здесь.

Действия модераторов можно обсудить здесь.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, LSD, Zloxa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | СУБД, общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0843 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.