Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Внешние ключи и соотнощение многие ко многим
|
|||
|---|---|---|---|
|
#18+
Скажите пожалуйста, есть такие таблицы: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Суть такая: таблица languages содержит список языков на которых могут быть поля в др. таблицах, т.е. есть 2 языка: (1)англ. и рус.(2), значит в таблице branches поле branch_name будет и на англ. и на рус.: branches: id = 1 branch_id = 1 branch_name = "Engl. name" language_id = 1 + id = 2 branch_id = 1 branch_name = "Рус. назв." language_id = 2 Получается что branch_id не подходит для того чтобы быть (PK). В таблице users_in_branches список пользователей, которые входят в определнные "branches". Могут входить сразу в несколько, следовательно linking_id (PK для табл. users) не может и здесь быть (PK), вводим новый (PK) id. Получаем таблицу которая хранит внешние ключи, но один внешний ключ ссылается не на Первичный ключ, а на обычное поле, и связь не один-к-одному и даже не один-ко-многим, А многие-ко-многим. Правильной ли является такая структура БД? Может ли внешний ключ (не PK) ссылаться на поле др. таблицы (FK), который не является первичным ключом? P.S. Собственно БД уже работает, и менять ее нет возможности. Но я пытался создать модель ее в UML (Enterprise Architect) и там у меня не получается показать связь ключей branch_id<->branch_id. Это и вызвало у меня вопрос о правильности структуры. Или может я просто не понял как нужно это сделать в Enterprise Architect? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2005, 13:17 |
|
||
|
Внешние ключи и соотнощение многие ко многим
|
|||
|---|---|---|---|
|
#18+
Как я понимаю, users_in_branches - это таблица, обеспечивающая связь m-m users и branches. Тогда поле branch_id должно быть pk в branches. А какая нужда, собственно, заставляет вас думать о нем в этой таблице, как о FK? Может, еще какой-то сущности не хватает? Можно то же посмотреть в виде бизнес-модели? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2005, 13:23 |
|
||
|
Внешние ключи и соотнощение многие ко многим
|
|||
|---|---|---|---|
|
#18+
UrriКак я понимаю, users_in_branches - это таблица, обеспечивающая связь m-m users и branches. Тогда поле branch_id должно быть pk в branches. А какая нужда, собственно, заставляет вас думать о нем в этой таблице, как о FK? Может, еще какой-то сущности не хватает? Можно то же посмотреть в виде бизнес-модели? Если убрать таблицу languages, то уйдет ключ language_id из таблицы branches и ключ branch_id автоматически станет PK, НО идея была в том, чтобы была многоязыковость, т.е. чтобы названия "branches" хранились на нескольких языках. Суть в том, что есть Категория (branch), назовем ее "Marketing", вот, но нам нужно ее название на нескольких языках, для этого и присваиваем ей не первичный ключ, branch_id, который одинаков для всех языков (скажем = 1) но для англ. версии ключ language_id=1, для рус. = 2. Когда добавляем запись о том что пользователь принадлежит к какомуту "бранчу" то указываем именно branch_id (который одинаков для всех языков), если бы мы указали PK, то привязались бы к названию на каком-то определенном языке... Собственно... Возможно ли такое? Или это ошибка? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2005, 13:36 |
|
||
|
Внешние ключи и соотнощение многие ко многим
|
|||
|---|---|---|---|
|
#18+
В таблице branches делаешь составной PK из branch_id и language_id. Вместе с этим, language_id будет FK. Следовательно, branch_id и language_id пойдут в таблицу users_in_branches в качестве FK. в эту же таблицу как FK пойдет linking_id из таблицы users. Поля branch_id, language_id и linking_id будут составным PK в таблице users_in_branches. Отдельный PK в описанной ситуации там делать незачем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2005, 16:09 |
|
||
|
Внешние ключи и соотнощение многие ко многим
|
|||
|---|---|---|---|
|
#18+
Так. Плюс в users поместить поле типа user_language. Понятно для чего? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2005, 16:31 |
|
||
|
Внешние ключи и соотнощение многие ко многим
|
|||
|---|---|---|---|
|
#18+
Не типа в смысле "типа", а в смысле "назвать его, например, так" ;-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2005, 16:32 |
|
||
|
Внешние ключи и соотнощение многие ко многим
|
|||
|---|---|---|---|
|
#18+
UrriНе типа в смысле "типа", а в смысле "назвать его, например, так" ;-))) Это поле есть, просто я его не показал, чтобы не загромождать схемку. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.07.2005, 16:59 |
|
||
|
Внешние ключи и соотнощение многие ко многим
|
|||
|---|---|---|---|
|
#18+
А если еще правильнее, то должна быть связь m-m между branches и languages. Так что заводим таблицу branches_to_language, и именно туда относим поле branch_name. А не зависимые от языка поля оставляем в branches. Вот и все. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.07.2005, 00:11 |
|
||
|
Внешние ключи и соотнощение многие ко многим
|
|||
|---|---|---|---|
|
#18+
Igor Pavlenko P.S. Собственно БД уже работает, и менять ее нет возможности. Но я пытался создать модель ее в UML (Enterprise Architect) и там у меня не получается показать связь ключей branch_id<->branch_id. Это и вызвало у меня вопрос о правильности структуры. Или может я просто не понял как нужно это сделать в Enterprise Architect? Скорее всего и реализована эта связь не декларативным, а программным путем типа проверки что в branches существует по крайней мере одна запись про users_in_branches.branch_id. Аналогично, удаление branches также становится нетривиальной задачей - нужно удалить все упоминания на всех языках. В общем программный код должен классически демонстрировать все аномалии при нарушении нормализации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.07.2005, 12:25 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=33158066&tid=1545773]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
130ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
1ms |
| others: | 277ms |
| total: | 485ms |

| 0 / 0 |
