Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Две связи между двумя таблицами / 21 сообщений из 21, страница 1 из 1
05.07.2010, 00:20
    #36722334
dandare
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
Доброй ночи, всем!
Прошу прощения, если такой вопрос уже был. Поиском честно пользовался - не нашёл. =)

Прошу помощи в таком вопросе.
Как корректно (нормализованно) сделать следующие связи.
Имеем две таблицы:
- users
- orders

В таблице users есть ключевое поле id_user и другие поля.

В таблице orders также несколько полей, среди которых которых два поля.
id_customer - заказчик, внешний ключ к users.id_user
id_executive - исполнитель, также внешний ключ к users.id_user

Пользователи могут быть как заказчиками так и исполнителями друг у друга.
Как грамотно связать 2 таблицы с 2 связями?
...
Рейтинг: 0 / 0
05.07.2010, 06:18
    #36722462
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
А чем не устраивает решение "в лоб"
Код: plaintext
1.
alter table orders add constraint fk_orders_users1 foreign key (id_customer) references users
alter table orders add constraint fk_orders_users2 foreign key (id_executive) references users
...
Рейтинг: 0 / 0
05.07.2010, 08:33
    #36722545
kink
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
dandare,

Рассматривай эту ситуацию как связь трёх таблиц, а не двух.
...
Рейтинг: 0 / 0
05.07.2010, 08:54
    #36722560
lazovik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
делал так, через 3-ю таблицу:
users2orders:
users2orders.id_user
users2orders.id_orders
users2orders.type - тип отношения, в твоем случае (1-заказчик, 2-исполнитель и т.д.)
более универсально
kink - это наверное имел ввиду...
...
Рейтинг: 0 / 0
05.07.2010, 09:02
    #36722567
Программист-Любитель
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
Мне кажется последнее решение перемудрённым. Ссылки из нескольких полей на одну и ту же таблицу - обычная вещь. Например, сделка - покупатель и продавец, доверенность - лицо, выдавшее доверенность и на кого выдана и т.п.
...
Рейтинг: 0 / 0
05.07.2010, 09:21
    #36722603
dandare
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
SERG1257

В лоб не устраивает, потому как потом запросов много получается. Например, выборка для orders по id_customer, т.е. все заказы такого то чела как заказчика. Нужно в одну таблицу выводить инфу о заказчике и исполнителе. Как писать соедниение для таких случаев?

kink

Можно пример?

lazovik

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

Программист-Любитель

Можно пример Вашего решения?
...
Рейтинг: 0 / 0
05.07.2010, 09:55
    #36722663
Vint_x
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
Попробуй так:

Код: plaintext
1.
2.
3.
4.
5.
SELECT usr1.Name as customer, usr2.Name as executive
FROM 
    users as usr1, users as usr2, orders
WHERE 
    orders.id_customer = usr1.id_user and orders.id_executive = usr2.id_user 
В MySQL работает
...
Рейтинг: 0 / 0
05.07.2010, 09:59
    #36722675
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
авторКак писать соедниение для таких случаев?Тоже "в лоб"
Код: plaintext
1.
2.
3.
4.
5.
select * from orders o
join users c on o.id_customer=c.user_id
join users e on o.id_executive=e.user_id
where ...
order by
...
Рейтинг: 0 / 0
05.07.2010, 10:14
    #36722705
dandare
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
Ок. Спасибо Vint_x и SERG1257 !
Работает.
...
Рейтинг: 0 / 0
05.07.2010, 11:35
    #36722913
lazovik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
Программист-ЛюбительМне кажется последнее решение перемудрённым...
скорее универсальней ;-)
Программист-Любитель...Например, сделка - покупатель и продавец, доверенность - лицо, выдавшее доверенность и на кого выдана и т.п. - это сегодня, а завтра прибавятся договора, доп.соглашения, счета, счет-фактуры и т.д. список мона длинный написать... ;-)
Но если такое не предвидится, то представленных решений хватит!
...
Рейтинг: 0 / 0
05.07.2010, 11:57
    #36722993
A1ek5andr0
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
Если заказчик и исполнитель в одном экземпляре, то:
SERG1257А чем не устраивает решение "в лоб"
Код: plaintext
1.
alter table orders add constraint fk_orders_users1 foreign key (id_customer) references users
alter table orders add constraint fk_orders_users2 foreign key (id_executive) references users


иначе:

Link_users_ordersuser_idorder_idtype_id

Link_type
id name1заказчик2исполнитель
...
Рейтинг: 0 / 0
05.07.2010, 12:52
    #36723156
dandare
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
A1ek5andr0Если заказчик и исполнитель в одном экземпляре, то:
иначе:

Link_users_ordersuser_idorder_idtype_id

Link_type
id name1заказчик2исполнитель

Спасибо, можно как вариант.
...
Рейтинг: 0 / 0
16.07.2010, 10:47
    #36744642
Bochagov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
Решил не создавать новой темы, потому что вопрос в принципе похожий.

Хочу организовать что-то типа внутренне почты на сайте. То есть зарегистрированные пользователи могут обмениваться сообщениями в рамках сайта (форумная почта)

И вот тут что-то странное. Одно дело связь многие-ко-многим между двумя разными сущностями, а тут нужно с одной и той же сущностью "Пользователь"

В принципе, если поразмыслить, то ниже приведённый вариант вполне подходит, но всё равно очень смущает:



Подскажите, можно так оставлять или есть другие варианты?
...
Рейтинг: 0 / 0
16.07.2010, 13:07
    #36745007
Lemegeton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
Не смущайтесь, это гораздо более частое явление, чем вы себе представляете.
...
Рейтинг: 0 / 0
16.07.2010, 13:31
    #36745051
Rin@t
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
BochagovПодскажите, можно так оставлять или есть другие варианты?Конечно, есть. Отправитель может послать одно и тоже сообщение нескольким получателям.
...
Рейтинг: 0 / 0
16.07.2010, 16:49
    #36745600
rmka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
Rin@tBochagovПодскажите, можно так оставлять или есть другие варианты?Конечно, есть. Отправитель может послать одно и тоже сообщение нескольким получателям.
получателей выносишь в отдельную таблицу с ссылками на id сообщения и id получателя. а за одно можешь и отправителя туда вынести и поставить признак отправитель это или получатель или в отдельную колонку. как тебе понравиться.
...
Рейтинг: 0 / 0
16.07.2010, 23:17
    #36746041
Bochagov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
Если я правильно понял, то схема должна выглядеть примерно следующим образом:

В таблице Post - UserID есть соответственно идентификатор получателя



Вообще, если таблица содержит в себе только внешние ключи, это допустимо?
...
Рейтинг: 0 / 0
17.07.2010, 01:37
    #36746172
Lemegeton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
Допустимо.

В вашей схеме у мессаджа много не только получателей, но и отправителей? ))))

Достаточно было бы сделать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE `user` (
   `id` INT PRIMARY KEY AUTO_INCREMENT
)

CREATE TABLE `message` (
   `id` INT PRIMARY KEY AUTO_INCREMENT,
   `sender_id` INT,
   `text` TEXT
)

CREATE TABLE `message_recievers` (
   `message_id` INT,
   `reciever_id` INT,
   PRIMARY KEY (`message_id`, `reciever_id`)
)

Правда, при таком раскладе нельзя отправлять от нескольких человек одно сообщение и нельзя отправить одно и то же дважды одному и тому же.
...
Рейтинг: 0 / 0
19.07.2010, 15:04
    #36748335
rmka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
LemegetonДопустимо.

В вашей схеме у мессаджа много не только получателей, но и отправителей? ))))

Достаточно было бы сделать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE `user` (
   `id` INT PRIMARY KEY AUTO_INCREMENT
)

CREATE TABLE `message` (
   `id` INT PRIMARY KEY AUTO_INCREMENT,
   `sender_id` INT,
   `text` TEXT
)

CREATE TABLE `message_recievers` (
   `message_id` INT,
   `reciever_id` INT,
   PRIMARY KEY (`message_id`, `reciever_id`)
)

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

"В вашей схеме у мессаджа много не только получателей, но и отправителей? ))))"
Это всего лишь БД. Хранить и получателей и отправителей можно в одной таблице, что бы было удобно потом селекты писать ... ну допускает она несколько отправителей :) можно индекс уникальный поставить на отправителя и мессадже_id :)
...
Рейтинг: 0 / 0
19.07.2010, 15:08
    #36748354
rmka
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
п.с. про индекс поспешил, не подумал :) лишнее дело контролировать нескольких отправителей одного сообщения...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
02.05.2014, 20:00
    #38631544
Kolobochek
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Две связи между двумя таблицами
Решил продолжить тему.
А если создать 2 таблицы дополнительно, отправитель и получатель, которые будут ссылаться на таблицу пользователь. а в таблице сообщение будет ссылки на таблицу получатель и отправитель.
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Две связи между двумя таблицами / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]