|
Как лучше организовывать связи между Свойствами
|
|||
---|---|---|---|
#18+
Добрый день Товарищи! Заголовк сформулирован коряво, т.к. непонятно как это сформулировать в строку. Итого: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36.
Собственно весь вопрос по 6 таблице в которой хранить Языки которые пользователь использует в комнате. * Т.е. набор языков пользователя в комнате должен быть подмножеством языков которыми он владеет (не обязательно все) И если реализовывать по FK на таблицу UserLangs, то везде в запросах для проверки соответствия ЯЗЫКА, ПОЛЬЗОВАТЕЛЯ, КОМНАТЫ появляются дополнительные JOIN'ы. Код: sql 1. 2. 3. 4. 5. 6.
А если реализовать таким типом Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
то вроде связность данных страдает. И смысл в том, что глубина таких связей может быть больше чем тут описано. Такой тип задачи как в БД правильно спроектировать? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 12:08 |
|
Как лучше организовывать связи между Свойствами
|
|||
---|---|---|---|
#18+
kormot, опишите кратко предметную область: в чём участвуют люди, что за комнаты такие и зачем участники там сидят? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 12:15 |
|
Как лучше организовывать связи между Свойствами
|
|||
---|---|---|---|
#18+
Дмитрий Мух , предметная область вообще не про Участников, Комнаты и Языки :) Просто терминологией настоящих сущностей чтобы понять смысл и связи - это надо будет описывать более широкий круг Сущностей, что совсем бессмысленно :) Смысл описывается математически вроде понятно, в моём посте. Но могу ещё так расписать: 1. Участники - это "Корневая Сущность" 2. Комнаты - это "Корневая Сущность" 3. Язык - это "Корневая Сущность" 1. Участники имеют связь "Один ко Многим" к Языкам ( UL_ID ). Это значит, что Участник владеет данным набором Языков. 2. Участники имеют связь "Один ко Многим" к Комнатам. Это значит, что Участник может состоять в Комнатах (да, единомоментно в нескольких) 3. В каждой Комнате Участник ( UR_ID ) может Пользоваться неким набором Языков ( UL_ID ) пересекающимся с ЯзыкамиКоторымиВладеетУчастник Собственно вопрос в том, реализовывать связь Языков Участников в Комнатах в виде ( UR_ID, UL_ID ) или в виде (userID, roomID, langID) Подразумевается, что Языки Пользователя как записи UL_ID не удаляются. Т.е. каскадно все ссылки на UL_ID НЕ удаляются. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 13:36 |
|
Как лучше организовывать связи между Свойствами
|
|||
---|---|---|---|
#18+
kormot Такой тип задачи как в БД правильно спроектировать? Чтобы ответить, нужно прочитать толковое описание задачи (а не попытки её решения). По приведённому я бы сказал, что наблюдается явная избыточность сущности UserRoom, её нужно просто выкинуть вместе с создаваемыми ей проблемами. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 13:41 |
|
Как лучше организовывать связи между Свойствами
|
|||
---|---|---|---|
#18+
kormot В каждой Комнате Участник ( UR_ID ) может Пользоваться неким набором Языков ( UL_ID ) пересекающимся с ЯзыкамиКоторымиВладеетУчастник Пересекающимися, или только теми, которыми владеет? И "может пользоваться" и "владеет" - тоже давольно-таки разные вещи. Вообщем исходя из того описания, что вы предоставили, я склоняюсь к варианту: userID, roomID, langID. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 13:46 |
|
Как лучше организовывать связи между Свойствами
|
|||
---|---|---|---|
#18+
softwarer её нужно просто выкинуть вместе с создаваемыми ей проблемами. ок, подумаю на этот счёт. А каким образом хранить присутсвие Участника в Комнате хранить? По поводу описания чего надо, а не как решил: Надо иметь возможность Объекту1 (Участнику) ставить в соответствие подмножество Объектов2 (Языки) в разрезе Объектов3 (Комнаты). И это множество Объектов2 в разрезе Объектов3 ( Языки Пользователя в Комнате ) должно всегда быть подмножеством одного множества Объектов2 (Языков которыми в принципе владеет Участник). Рекурсия она рекурсивная :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 13:53 |
|
Как лучше организовывать связи между Свойствами
|
|||
---|---|---|---|
#18+
Дмитрий Мух Пересекающимися, или только теми, которыми владеет? И "может пользоваться" и "владеет" - тоже давольно-таки разные вещи. Так я же на примере языков потому и описал, т.к. Участник может знать (владеть) Язык, но в определённом месте (Комната) пользоваться набором языков и пустым тоже (NULL => Молчать) которое при любом раскладе будет подмножеством ЯзыковКоторымиОнВладеет. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 13:57 |
|
Как лучше организовывать связи между Свойствами
|
|||
---|---|---|---|
#18+
kormot Дмитрий Мух Пересекающимися, или только теми, которыми владеет? И "может пользоваться" и "владеет" - тоже давольно-таки разные вещи. Так я же на примере языков потому и описал, т.к. Участник может знать (владеть) Язык, но в определённом месте (Комната) пользоваться набором языков и пустым тоже (NULL => Молчать) которое при любом раскладе будет подмножеством ЯзыковКоторымиОнВладеет. Изначально вы написали "языки программирования". Пользоваться ими можно по-разному. Можно использовать по полной в каждодневной работе, а можно время от времени что-то простенькое пописывать, какие-то небольшие вещи править. К примеру не обязательно прям владеть YAML, чтобы им пользоваться. Также можно владеть C# и при этом пользоваться примерами кода на Java В резюме же никто не указывает все языки, которыми пользовался, как те, чем владеешь. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 14:18 |
|
Как лучше организовывать связи между Свойствами
|
|||
---|---|---|---|
#18+
kormot А каким образом хранить присутсвие Участника в Комнате хранить? Просматриваются несколько возможных решений. Можно решить, что безъязыкие участники не нужны. Можно сделать язык необязательным и хранить (участник; комната; null). Можно ввести спецязык "отсутствует". Можно придумать ещё что-нибудь. Что выбрать - зависит от конкретной бизнес-логики с этими объектами, не удастся назвать универсально лучшее решение. kormot Надо иметь возможность Объекту1 (Участнику) ставить в соответствие подмножество Объектов2 (Языки) в разрезе Объектов3 (Комнаты) Это решает UserRoomLangs. kormot И это множество Объектов2 в разрезе Объектов3 ( Языки Пользователя в Комнате ) должно всегда быть подмножеством одного множества Объектов2 (Языков которыми в принципе владеет Участник). Значит, из UserRoomLangs нужен внешний ключ на UserLangs. Кажется, до меня дошла причина Вашего вопроса. Вы почему-то считаете, что внешний ключ - это ul_id. На самом же деле он может быть, и в подобных структурах часто удобнее - (user_id, lang_id). ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 14:25 |
|
Как лучше организовывать связи между Свойствами
|
|||
---|---|---|---|
#18+
Дмитрий Мух Изначально вы написали "языки программирования". Пользоваться ими можно по-разному. Можно использовать по полной в каждодневной работе, а можно время от времени что-то простенькое пописывать, какие-то небольшие вещи править. К примеру не обязательно прям владеть YAML, чтобы им пользоваться. Также можно владеть C# и при этом пользоваться примерами кода на Java В резюме же никто не указывает все языки, которыми пользовался, как те, чем владеешь. Дмитрий, ну причём тут всё это, я же написал что это не более чем иллюстрация вопроса. softwarer Кажется, до меня дошла причина Вашего вопроса. Вы почему-то считаете, что внешний ключ - это ul_id. На самом же деле он может быть, и в подобных структурах часто удобнее - (user_id, lang_id). Это уже попахивает очередным SQL откровением, т.е. это как использовать? Как составной внешний ключ описать? softwarer Просматриваются несколько возможных решений. Можно решить, что безъязыкие участники не нужны. Можно сделать язык необязательным и хранить (участник; комната; null). Можно ввести спецязык "отсутствует". Можно придумать ещё что-нибудь. Что выбрать - зависит от конкретной бизнес-логики с этими объектами, не удастся назвать универсально лучшее решение. Тут может я так надавил на эти Языки, на самом деле Языки в Комнатах и у Пользователей это не единственная составляюшая этих свойств Участников относительно Комнат, я это просто привёл для иллюстрации задачи. Все эти Комнаты и Языки завели отвечающих не туда. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 19:39 |
|
Как лучше организовывать связи между Свойствами
|
|||
---|---|---|---|
#18+
kormot Как составной внешний ключ описать? Уверен, что документация используемой СУБД даст чёткий и точный ответ на этот вопрос. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.07.2020, 20:41 |
|
Как лучше организовывать связи между Свойствами
|
|||
---|---|---|---|
#18+
softwarer в итоге это именно то что я и спрашивал! И в целом я зачастую заводил прокси таблицу для преобразования двух полей в новый ключ, а на самом-то деле вон как правильно. Что за книжку прочитать по SQL чтобы эти все правила - то сразу и увидеть. А то вроде знаю и пользуюсь SQL'ем, а на деле оказывается что знаю лишь то, что ничего не знаю :) ... |
|||
:
Нравится:
Не нравится:
|
|||
16.07.2020, 09:35 |
|
|
start [/forum/topic.php?fid=32&fpage=3&tid=1539844]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
24ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
others: | 233ms |
total: | 351ms |
0 / 0 |