Организация БД (теория)

Resurs

Новичок
Организация БД (теория)

Есть такая задача.

таблицы: новости, софт, услуги, клиенты

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

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

В описании услуг должны быть ссылки на клиентов, на софт и нововсти "по теме".

Собственно вопрос:
Получается , что для каждой таблицы (допустим софт) надо делать одну связующую (с соответствующими парами id) таблицу с каждой оставшейся (софт-новости, софт-клиенты, софт-услуги и т.д.).
Нет ли другого, более изящного решения?
 

Resurs

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

Falc

Новичок
Resurs
Да, именно так и реализуется связь "многие ко многим", но возможно ты немного переборщил и тебя кое-где устроит связь "один ко многим".
 

Resurs

Новичок
Вот еще вопрос.
Имея таблицу описывающую связь клиент->софт (один клиент использует несколько софтов),
для описания связи софт->клиент(один софт используют несколько клиентов), надо ли создавать еще одну таблицу, которая будет описывать эту связь
 

vladax

Новичок
надо

1) таблица клиентов
2) таблица софта
3) таблица связей между клиентами и софтом

прибл. таким образом строишь запрос, если хочешь узнать какой софт использует клиент с номером 250

SELECT a.*
FROM softTable as a, linksTable as b, clientTable as c
WHERE a.soft_id = b.soft_id
AND b.client_id = c.client_id
AND c.client_id = 250

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

Demiurg

Guest
vladax
Ты действительно думаешь, что открыл автору топика что-то новое ? Мне кажется, он прекрасно способен сам составить запрос, просто есть сомнения по поводу построения БД.
 

Crazy

Developer
Автор оригинала: vladax
SELECT a.*
FROM softTable as a, linksTable as b, clientTable as c
WHERE a.soft_id = b.soft_id
AND b.client_id = c.client_id
AND c.client_id = 250
SELECT a.*
FROM softTable as a, linksTable as b
WHERE a.soft_id = b.soft_id
AND b.client_id = 250
 

Falc

Новичок
Resurs
>>Имея таблицу описывающую связь клиент->софт (один клиент использует несколько софтов)
Для связи "один ко многим" дополнительная таблица не нужна.

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

Serguitar

Новичок->продвинутый
А ещё лучше попробуй построить структуру базы так, чтобы запрос строился не от одного к многим, а от одного к общему.
 

Crazy

Developer
Автор оригинала: Falc
Для связи "один ко многим" дополнительная таблица не нужна.
Читаем первое сообщение:

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

Demiurg

Guest
>так, чтобы запрос строился не от одного к многим, а от одного к общему.
это как ?
 

Crazy

Developer
Ну типа единство и борьба противоположностей. И другая диалектика. :)
 

vladax

Новичок
SELECT a.*
FROM softTable as a, linksTable as b
WHERE a.soft_id = b.soft_id
AND b.client_id = 250
Да это я так.. чтобы подчеркунть связи :)
а вообще конечно достаточно
SELECT softTable.*
FROM softTable
LEFT JOIN linksTable USING (soft_id)
WHERE links.client_id = 250
 

Falc

Новичок
Crazy
>>Читаем первое сообщение:
>>Многие ко многим.

Мой пост относился не к первому сообщению если ты обратил внимание.
 
Сверху