|
|
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Разбираю чужую структуру БД. Между двумя очень объемными таблицами существует порядка 4 связей (3 один к многим и 4-ая многие к многим), наверное для различных запросов. Таблицы нормализованы. Ситуация нормальная?? зы в первый раз сталкиваюсь с такой объемной и сложной БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 11:51 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
vitaliy14Разбираю чужую структуру БД. Между двумя очень объемными таблицами существует порядка 4 связей (3 один к многим и 4-ая многие к многим), наверное для различных запросов. Таблицы нормализованы. Ситуация нормальная?? зы в первый раз сталкиваюсь с такой объемной и сложной БД. Нормально, бывает и хуже. Какой SQL-сервер? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 12:02 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Senya_L vitaliy14Разбираю чужую структуру БД. Между двумя очень объемными таблицами существует порядка 4 связей (3 один к многим и 4-ая многие к многим), наверное для различных запросов. Таблицы нормализованы. Ситуация нормальная?? зы в первый раз сталкиваюсь с такой объемной и сложной БД. Нормально, бывает и хуже. Какой SQL-сервер? MSSQL 2000 по логике тоже, так кажется. Не сложные запросы зато получаются. Прсто громоздко на схеме выглядит!? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 12:09 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
vitaliy14 Senya_L vitaliy14Разбираю чужую структуру БД. Между двумя очень объемными таблицами существует порядка 4 связей (3 один к многим и 4-ая многие к многим), наверное для различных запросов. Таблицы нормализованы. Ситуация нормальная?? зы в первый раз сталкиваюсь с такой объемной и сложной БД. Нормально, бывает и хуже. Какой SQL-сервер? MSSQL 2000 по логике тоже, так кажется. Не сложные запросы зато получаются. Прсто громоздко на схеме выглядит!? ) Схемы нужны для лучшего понимания структуры БД, а не для того, чтобы они красиво выглядели. Если схема не очень наглядно, к ней прикладывается пояснение. Не заморачивайся этими CASE-средствами проектирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 12:31 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
vitaliy14по логике тоже, так кажется. Не сложные запросы зато получаются. Прсто громоздко на схеме выглядит!? )Запросы не обязательно зависят от связей. которые отображены на схеме. Если в запросе джоин не будет указан явно, никакая связь из схемы не поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 12:35 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Еще один вопрос - Есть таблица "работа" и "подразделение заказчика". У каждой работы может быть несколько подразделений, но главное только одно ! (для этого есть поле IS_MAIN (yes/no)). Триггер нужно писать на update и insert? (Constraint не напишешь) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 12:51 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
vitaliy14но главное только одно ! (для этого есть поле IS_MAIN (yes/no)) Видимо, речь про дополнительную табличку и связь M:N? Так вот, в случае такой таблички есть методы попроще, без IS_MAIN-ов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 12:55 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов vitaliy14но главное только одно ! (для этого есть поле IS_MAIN (yes/no)) Видимо, речь про дополнительную табличку и связь M:N? Так вот, в случае такой таблички есть методы попроще, без IS_MAIN-ов. Да 3-я таблица "многие к многим". Какие методы? Пример бы мне? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 13:10 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
vitaliy14Пример бы мне? Делаете поле типа npp (номер по порядку). При выводе на печать сортируете по нему (все равно определенность нужна, а таким способом легко вручную управлять порядком записей). Главное подразделение - то, которое первое (с минимальным npp). Никаких ненужных триггеров. Если нужна гарантированная сортировка даже при совпадении значений npp, добавляете в перечень полей сортировки идентификатор. Надеюсь, уникальный индекс уже есть в этой таблице по паре полей "работа" и "подразделение"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 13:30 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Нет еще ничего таблицы пустые! Т.е. по пунктам Таблица Работа-ПЗ (подразделение заказчика) ---------------------------------------------- ID_JOB_Customer ID_JOB ID_Customer NPP 1. Нужно сделать unique индекс по полям ID_JOB - ID_Customer - NPP? 2. И считать NPP c 1 для главного? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 13:48 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
vitaliy14Нужно сделать unique индекс по полям ID_JOB - ID_Customer - NPP? Не-а, только по паре полей ID_JOB и ID_Customer. vitaliy14И считать NPP c 1 для главного? Да можно и с нуля. Не принципиально. Сортировка может быть типа order by sign(npp) desc,npp,ID_Customer или order by npp,ID_Customer. В первом случае все новые строки с нулевым значением npp будут "падать в конец". ID_Customer можно заменить на ID_JOB_Customer. Записей таких по сути немного будет, так что что бы Вы ни выдумали (в части сортировки), для сервера это будет не напряжно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 13:56 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Не работает или я вас не понял! получается id | id_customer| id_job | npp --------------------------- 1 | 1 | 1 | 1 2 | 2 | 1 | 1 Два ПЗ главных? Мне же нужно - для каждой работы из нескольких подразделений ее выполнявших одно было главным! Индекс по id_job и npp нужно строить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 14:13 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
id | id_customer| id_job | npp --------------------------- 1 | 1 | 1 | 1 <-----| 2 | 2 | 1 | 1 <-------- Два ПЗ главных? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 14:15 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
vitaliy14Два ПЗ главных? Главное - первое - всегда одно. Впрочем, можете сделать дополнительный уникальный индекс по ID_JOB и npp, если уж так хочется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 14:15 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Нужно в таблице Работ хранить ссылка на главное подразделение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 14:22 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов vitaliy14Два ПЗ главных? Главное - первое - всегда одно. Впрочем, можете сделать дополнительный уникальный индекс по ID_JOB и npp, если уж так хочется. Подождите запутался unique индекс только по полям ID_JOB - NPP - чтобы не было двух главных подразделений н а одну работу? и unique индекс по полям ID_JOB - ID_Customer, чтобы не было абсурда? Спасибо Вам большое :) зы это не единственная таблица с такими условиями, подобное нужно еще в нескольких местах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 14:23 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоНужно в таблице Работ хранить ссылка на главное подразделение. В смысле если не NULL, то главное! Помойму Сергей Васкецов предложил достаточно элегантное решение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 14:27 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Нет Работа должна сылать на главное подразделение. В таблице справочника Работ должно быть поле в котором хранится ссылка на таблицу справчоника подразделений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 14:31 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Т.е. по сути еще одна связь "Главное подразделение" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 14:32 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
А хранить это в как признак в другой связи ИМХО неверно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 14:33 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
vitaliy14unique индекс только по полям ID_JOB - NPP - чтобы не было двух главных подразделений н а одну работу? 1. Можно сделать уникальный индекс. Тогда при редактировании необходимо будет разруливать ситуацию (на уровне интерфейса, видимо), когда потребуется поменять местами два подразделения. 2. Можно не делать уникальный индекс, а обойтись сортировкой. Для получения главного подразделения использовать select top 1 ...., тогда ошибки нарушения индекса не будет (так как не будет индекса). 3. Можно сделать ссылку на главное подразделение как отдельный атрибут работы. В таком случае потребуется в зависимости от постановки задачи либо проверять, что ссылки на главное подразделение нет в перечне подразделений, либо наоборот, требовать в перечне подразделений ссылку на главное. То есть, в зависимости от логики, список подразделений будет либо списком всех используемых подразделений, либо списком всех вспомогательных подразделений. С моей точки зрения, решение идиотское как по постановке, так и по трудозатратам. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 14:44 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоНет Работа должна сылать на главное подразделение Прокомментировал сообщением выше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 14:45 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
А если хранить ссылку на элемнт перечня работ ? Проверять ничего не надо это БД проверяет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 14:53 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов vitaliy14unique индекс только по полям ID_JOB - NPP - чтобы не было двух главных подразделений н а одну работу? 1. Можно сделать уникальный индекс. Тогда при редактировании необходимо будет разруливать ситуацию (на уровне интерфейса, видимо), когда потребуется поменять местами два подразделения. 2. Можно не делать уникальный индекс, а обойтись сортировкой. Для получения главного подразделения использовать select top 1 ...., тогда ошибки нарушения индекса не будет (так как не будет индекса). Предложенный тобой вариант технически неграмотный и трудно(много кода, накладно для базы) реализуемый. Насколько я понял мы говорим о многопользовательском домтупе к БД. Если 1-й твой вариант еще хоть как-то будет что-то гарантировать, то 2-й вообще ничего не будет гарантировать, т.е. будем иметь несоклько главных подразделений. ИМХО решение попахивает ламеризмом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 15:04 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
автор Можно не делать уникальный индекс, а обойтись сортировкой. Для получения главного подразделения использовать select top 1 ...., тогда ошибки нарушения индекса не будет (так как не будет индекса). Действительно, 1 вариант хороший, но гемморой с редактированием. 2 вариант - проблем с редактированием нет, но прийдется на клиенте проверять,чтобы пользователи два ПЗ не сделали главными. Тогда теряется вообще какой-то смысл в ограничениях! Наверное 3. Хоть и будет избыточность, но проблем в первых 2 вариантах не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 15:40 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
О какой избыточности идет речь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 15:51 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоА если хранить ссылку на элемнт перечня работ ? Проверять ничего не надо это БД проверяет. И при удалении "главного" подразделения из перечня работ...? Все очень простото 2-й вообще ничего не будет гарантировать, т.е. будем иметь несоклько главных подразделений Лучше сначала разобраться, а потом критиковать. Подразделение главное всегда одно. Все очень простотрудно(много кода, накладно для базы) реализуемый Что-то я не понял. Надо написать один раз index и поправить запрос получения главного подразделения в части добавления top 1. Это сложно? Это сложнее, чем писать "по уму" триггер, что светит автору, если проверку нельзя сделать constraint-ом? Все очень простоНасколько я понял мы говорим о многопользовательском домтупе к БД. Многопользовательское чтение? Многопользовательское редактирование состава подразделений в рамках одной работы? Продолжать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 15:54 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
vitaliy142 вариант - проблем с редактированием нет, но прийдется на клиенте проверять,чтобы пользователи два ПЗ не сделали главными Главное подразделение может быть всегда только одно даже в том случае, если два значения npp в перечне подразделений совпадают. Просто в этом случае для его определения потребуется использовать еще одно поле (гарантированно уникальный хотя бы в рамках одной работы идентификатор). Например, select top ... order by ... Идея тривиальная же. Важно только, чтобы можно было всегда сказать, какое главное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 15:58 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов Все очень простоА если хранить ссылку на элемнт перечня работ ? Проверять ничего не надо это БД проверяет. И при удалении "главного" подразделения из перечня работ...? А также является ли ссылка (главное подразделение) на "дочерний" перечень с подразделениями обязательным полем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 16:00 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов Все очень простоА если хранить ссылку на элемнт перечня работ ? Проверять ничего не надо это БД проверяет. И при удалении "главного" подразделения из перечня работ...? Можно устанавливать в NULL средствами БД (.. on delete set NULL) Все очень простото 2-й вообще ничего не будет гарантировать, т.е. будем иметь несоклько главных подразделений Лучше сначала разобраться, а потом критиковать. Подразделение главное всегда одно. Т.е. ты хочешь сказать что если их будет несколько то главным выберется тот , который понравиться серверу TOP 1 ? Ну это же полная чушь!! Все очень простотрудно(много кода, накладно для базы) реализуемый Что-то я не понял. Надо написать один раз index и поправить запрос получения главного подразделения в части добавления top 1. Это сложно? Это сложнее, чем писать "по уму" триггер, что светит автору, если проверку нельзя сделать constraint-ом? НЕт ты не понял надо обеспечить (во 2-м варианте) униакльность главного направления, а это задача не простая (не эффективная) если делать это самому. Все очень простоНасколько я понял мы говорим о многопользовательском домтупе к БД. Многопользовательское чтение? Многопользовательское редактирование состава подразделений в рамках одной работы? Имелась ввиду именно многопользовательская запись. Продолжать? Да. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 16:18 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей, извиняюсь может я торможу, но вас не совсем понимаю по 2 варианту смотрите я предположим съимитировал ошибку пользователей id | id_customer| id_job | npp --------------------------- 1 | 1 | 1 | 1 2 | 2 | 1 | 1 3 | 5 | 1 | 1 <---- 3 ПЗ главных? предложенным запросом Код: plaintext 1. 2. Result id | id_customer| id_job | npp --------------------------- 1 | 1 | 1 | 1 А если на самом деле главное id_customer = 5 !? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 16:23 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов Просто в этом случае для его определения потребуется использовать еще одно поле (гарантированно уникальный хотя бы в рамках одной работы идентификатор) Брррр... какой еще идентификатор!? В таблице связи перечня работ? напишите, пожалуйста , пример ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 16:27 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
vitaliy14Брррр... какой еще идентификатор!? В таблице связи перечня работ? напишите, пожалуйста , пример Пример я уже писал: order by npp,ID_Customer. ID_Customer можно заменить на ID_JOB_Customer. Если в интерфейсе и в определении главного подразделения будет одна и та же сортировка, то то подразделение, которое будет в интерфейсе первым, всегда будет главным с точки зрения логики выбора главного подразделения. vitaliy14А если на самом деле главное id_customer = 5 !? Если исходить из того, что главное подразделение в интерфейсе всегда первое, то значит для обеспечения "главности" этого подразделения потребуется указать правильные значения npp. Важно только, что ЭТИ ЖЕ значения приоритетов будут использоваться в логике, которая требует определения главного подразделения. И что сервер не сможет возвращать результаты, как ему вздумается, а будет гарантирован порядок возврата используемых подразделений и, следовательно, детерминированность главного подразделения. Все очень простоМожно устанавливать в NULL средствами БД (.. on delete set NULL) Можно. Но тогда возникает необходимость дополнительной проверки, а установлено ли для работы главное подразделение. Тогда как в моем случае достаточно указания хотя бы одного любого подразделения, самое первое будет автоматически главным. Все очень простоТ.е. ты хочешь сказать что если их будет несколько то главным выберется тот , который понравиться серверу TOP 1 ? Ну это же полная чушь!! Именно что чушь. Именно для этого я и написал про order by. Комбинация полей в секции order by будет УНИКАЛЬНА. Так что никакого произвола в здравом уме со стороны сервера не предполагается. Все очень простоИмелась ввиду именно многопользовательская запись Не понял. Где конкретно засада? Даже если в страшном сне предположить, что наряд на работу редактируется одновременно несколькими пользователями, то почему сложнее будет редактировать один список, а не тот же список + еще одно дополнительное поле? Если список не тот же (фактически, без npp), то как в Вашем случае Вы будете объяснять тупым юзерам, почему сервер выдает подразделения в произвольном порядке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 17:29 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
В моем случае нельзя вставить больше одного главного подразделения, поскольку поле одно. В твоем случае никто не мешает двум пользователям вставить две записи с одинаковым порядком сортировки по которому у тебя определяется главное подразделение. Автору - не поддавайся на провокацию! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 17:41 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простос одинаковым порядком сортировки по которому у тебя определяется главное подразделение Очевидно, Вы что-то недопоняли. То, что Вы пишете, невозможно реализовать даже десяти пользователям. Попробуйте еще раз понять, почему это так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 18:01 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоВ моем случае нельзя вставить больше одного главного подразделения, поскольку поле одно Очевидно, все 10 человек, мечтающих вставить в одно поле каждый свое главное подразделение, с большей вероятностью добьются успеха, чем 10 человек, вставляющих подразделения в отдельный список, которым можно просто заранее сказать, что 0 резервируется для главного? В общем, Вы меня здорово посмешили. И это мы еще не начали обсуждать разумность и жизненность многопользовательского одновременного редактирования перечня подразделений в наряде на работу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 18:04 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
В вашем случае очень легко два пользователя одновремнно вставляют две записи с одинаковыми npp + какой-то идентификатор. База данных им этого не запретит уникального индекса в данном варианте нет. Что может помешать им сделать это? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 18:12 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоВ вашем случае очень легко два пользователя одновремнно вставляют две записи с одинаковыми npp + какой-то идентификатор. База данных им этого не запретит уникального индекса в данном варианте нет. Что может помешать им сделать это? Ничего не сможет им помешать, если только они не вставят одно и то же подразделение. Но из этого не следует, что оба подразделения будут главными. Более того, этот вариант разруливается на корню даже для подобных Вам эстетов, если юзерам объяснить, что npp=0 можно использовать только для главного подразделения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 18:15 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
vitaliy14 пишет: > Разбираю чужую структуру БД. Между двумя очень объемными таблицами > существует порядка 4 связей (3 один к многим и 4-ая многие к многим), > наверное для различных запросов. Таблицы нормализованы. Ситуация > нормальная?? Да. Количество связей между таблицами может быть любым. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.07.2008, 22:00 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
[quot Сергей Васкецов] Ничего не сможет им помешать, если только они не вставят одно и то же подразделение. [/quo Что и требовалось доказать. А в предложенным мной вараинте БД им этого не позволит сделать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2008, 14:58 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоЧто и требовалось доказать. А в предложенным мной вараинте БД им этого не позволит сделать. Я не понимаю, на каком языке Вам написать, чтобы Вы соизволили прочитать то, что я Вам пишу как минимум дважды. Если не желаете читать и думать - ради бога. Только не надо думать, что я считаю предложенный способ с npp лишенным всяческих недостатков. Я всегда знаю о недостатках того, что предлагаю. Просто я считаю способ с выделенным атрибутом главного подразделения для выбора одного из подразделений из перечня совсем неудачным, если учесть контекст обсуждения и нежелание возиться с триггерами (то есть, нежелание писать код SQL руками). И если от одного из подразделений только лишь и требуется, что считать его главным, то смысла городить какой-то дополнительный огород вообще не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2008, 15:19 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
То что я предложил это называется модель данных , а то что вы предлагаете это вынесение модели данных в логику приложения. Чувствуете разницу? Ладно, Сергей. Если выдействительно так считаете и не хотите подумать, то жизнь Вас научит. За сим откланиваюсь. Было приятно пообщаться ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2008, 15:43 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоТо что я предложил это называется модель данных , а то что вы предлагаете это вынесение модели данных в логику приложения. Чувствуете разницу? Я вообще не понимаю, к чему подобные высокопарные слова и чушь про многоюзерность, если Вы не понимаете, что согласно Вашей же модели главное подразделение должно быть обязательным, а раз в рамках модели данных этого добиться нельзя (ибо нельзя сделать ссылку на несуществующую сущность), то реализация этого (контроля, что не нафигачили подразделений без указания главного) будет ЗА рамками Вашей же модели данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2008, 15:50 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов Все очень просто Я вообще не понимаю, к чему подобные высокопарные слова и чушь про многоюзерность, если Вы не понимаете, что согласно Вашей же модели главное подразделение должно быть обязательным, а раз в рамках модели данных этого добиться нельзя (ибо нельзя сделать ссылку на несуществующую сущность), то реализация этого (контроля, что не нафигачили подразделений без указания главного) будет ЗА рамками Вашей же модели данных. Почему же обязательность главного подразделения нельзя добиться в рамках модели? Что то тут я Вас совсем не поянл. Это поле можно сделать обязательным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2008, 15:54 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоЭто поле можно сделать обязательным. Уф. 1. Состояние работы "есть хотя бы одно подразделение в перечне подразделений, но нет главного подразделения" является ошибочным с точки зрения логики. 2. Состояние работы "главное подразделение указано, но отсутствует в перечне используемых подразделений" является ошибочным исходя предположения и сути такого перечня (см. мой комментарий сильно выше в топике). 3. Если есть желание первым указать неглавное подразделение, исходя из 1 необходимо бить юзера по рукам и запрещать это делать. 4. Если есть желание указать в перечне подразделений главное подразделение, то в момент вставки записи оно должно "скопироваться" в поле "главное подразделение", иначе будет нарушение 1. 5. Если есть желание указать главное подразделение непосредственно в предназначенном для него поле, то необходимо в момент изменения значения данного поля вставить новое значение главного подразделения в перечень всех используемых подразделений, иначе будет нарушение 2. Что делать со старым значением - вообещ непонятно, то ли удалить его из перечня подразделений, то ли оставить. 6. Удалить главное подразделение непосредственно из перечня подразделений нельзя, так как нарушится обязательность поля и (может быть) 1. Итого: а) только лишь за пункт 3 я бы уже отказался от обязательности поля в модели. б) ни 4, ни 5 нельзя реализовать без дополнительного написания кода, выходящего ЗА рамки собственно модели данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2008, 16:08 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов Все очень простоЭто поле можно сделать обязательным. Уф. 1. Состояние работы "есть хотя бы одно подразделение в перечне подразделений, но нет главного подразделения" является ошибочным с точки зрения логики. Если поле сделать обязательным то такого состояния не будет 2. Состояние работы "главное подразделение указано, но отсутствует в перечне используемых подразделений" является ошибочным исходя предположения и сути такого перечня (см. мой комментарий сильно выше в топике). Выше по топику я писал что ссылка указывается не на само подрпазделение, а на злемент из списка связанных подразделений. Поэтому данная ситуация не допустима 3. Если есть желание первым указать неглавное подразделение, исходя из 1 необходимо бить юзера по рукам и запрещать это делать. В моем варианте можно связывать с подразделениями и выбирать главный в любом порядке(не только первым) 4. Если есть желание указать в перечне подразделений главное подразделение, то в момент вставки записи оно должно "скопироваться" в поле "главное подразделение", иначе будет нарушение 1. Это особенности реализации пользовательского интерфейса 5. Если есть желание указать главное подразделение непосредственно в предназначенном для него поле, то необходимо в момент изменения значения данного поля вставить новое значение главного подразделения в перечень всех используемых подразделений, иначе будет нарушение 2. Что делать со старым значением - вообещ непонятно, то ли удалить его из перечня подразделений, то ли оставить. Это особенности реализации пользовательского интерфейса, также см. пункт 2. 6. Удалить главное подразделение непосредственно из перечня подразделений нельзя, так как нарушится обязательность поля и (может быть) 1. Обязательность не нарушится если в этой же транзакции указать новое главное. Поведение внешнего ключа при этом должно быть отложенным. Итого: а) только лишь за пункт 3 я бы уже отказался от обязательности поля в модели. б) ни 4, ни 5 нельзя реализовать без дополнительного написания кода, выходящего ЗА рамки собственно модели данных. Итого все пункты укалдываются в модель ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2008, 16:28 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
ОписАлся 6. Удалить главное подразделение непосредственно из перечня подразделений нельзя, так как нарушится обязательность поля и (может быть) 1. Обязательность не нарушится если в этой же транзакции указать новое главное. Поведение ограничения обязательности при этом должно быть отложенным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2008, 16:35 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень просто1. Состояние работы "есть хотя бы одно подразделение в перечне подразделений, но нет главного подразделения" является ошибочным с точки зрения логики. Если поле сделать обязательным то такого состояния не будет 2. Состояние работы "главное подразделение указано, но отсутствует в перечне используемых подразделений" является ошибочным исходя предположения и сути такого перечня (см. мой комментарий сильно выше в топике). Выше по топику я писал что ссылка указывается не на само подрпазделение, а на злемент из списка связанных подразделений. Поэтому данная ситуация не допустима 3. Если есть желание первым указать неглавное подразделение, исходя из 1 необходимо бить юзера по рукам и запрещать это делать. В моем варианте можно связывать с подразделениями и выбирать главный в любом порядке(не только первым) Если главное подразделение А, а кроме него есть также Б и В, каким образом можно указать в работе подразделения Б и В, а на следующий день указать подразделение А в качестве главного? Все очень просто 4. Если есть желание указать в перечне подразделений главное подразделение, то в момент вставки записи оно должно "скопироваться" в поле "главное подразделение", иначе будет нарушение 1. Это особенности реализации пользовательского интерфейса Выходящее ЗА рамки модели. Что и требовалось доказать. Прочее тоже выходит за рамки модели. Обзывать это "особенностями реализации пользовательского интерфейса" можно, но бессмысленно, это просто словоблудство. Тем более что Вы сами пеняли мне этим выше. Итого, то, что Вы предлагаете, не может быть моделью данных как таковой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2008, 16:38 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов Все очень просто1. Состояние работы "есть хотя бы одно подразделение в перечне подразделений, но нет главного подразделения" является ошибочным с точки зрения логики. Если поле сделать обязательным то такого состояния не будет 2. Состояние работы "главное подразделение указано, но отсутствует в перечне используемых подразделений" является ошибочным исходя предположения и сути такого перечня (см. мой комментарий сильно выше в топике). Выше по топику я писал что ссылка указывается не на само подрпазделение, а на злемент из списка связанных подразделений. Поэтому данная ситуация не допустима 3. Если есть желание первым указать неглавное подразделение, исходя из 1 необходимо бить юзера по рукам и запрещать это делать. В моем варианте можно связывать с подразделениями и выбирать главный в любом порядке(не только первым) Если главное подразделение А, а кроме него есть также Б и В, каким образом можно указать в работе подразделения Б и В, а на следующий день указать подразделение А в качестве главного? Не понял вопрос. В любое время у работы должно быть одно и только одно подразделение. Это и описывается моделью. Если сегодня одно подразделение главное, а завтра другое, то просто меняешь одну ссылку на другую. Все очень просто 4. Если есть желание указать в перечне подразделений главное подразделение, то в момент вставки записи оно должно "скопироваться" в поле "главное подразделение", иначе будет нарушение 1. Это особенности реализации пользовательского интерфейса Выходящее ЗА рамки модели. Что и требовалось доказать. Прочее тоже выходит за рамки модели. Обзывать это "особенностями реализации пользовательского интерфейса" можно, но бессмысленно, это просто словоблудство. Тем более что Вы сами пеняли мне этим выше. Итого, то, что Вы предлагаете, не может быть моделью данных как таковой. Это не словоблудство, а именно особенности реализации ПИ. Если ты утверждаешь что модель не соотвествует предметной области, то приведи хоть один пример когда модель допускает введение нецелостных(неверных) данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2008, 16:48 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоЕсли главное подразделение А, а кроме него есть также Б и В, каким образом можно указать в работе подразделения Б и В, а на следующий день указать подразделение А в качестве главного? Не понял вопрос. В любое время у работы должно быть одно и только одно подразделение. Это и описывается моделью. Если сегодня одно подразделение главное, а завтра другое, то просто меняешь одну ссылку на другую. Как можно было не понять столько четко сформулированный вопрос? 1. Согласно задаче автора, у работы может быть сколь угодно много подразделений (фактически, больше нуля), но обязательно есть одно главное подразделение. 2. Подразделения Б и В не являются главными. 3. Главным является подразделение А. 4. Есть желание главное подразделение указать ПОСЛЕДНИМ среди всех подразделений. До этого никаких главных подразделений нет, ни Б ни В им быть не может. Это не какая-то фантастическая ситуация. Например, главным подразделением является контролирующее подразделение, какое именно оно будет - заранее неизвестно (ОТК). То есть это вполне житейская ситуация, не выходящая за рамки задачи автора. Все очень простоЕсли ты утверждаешь что модель не соотвествует предметной области, то приведи хоть один пример когда модель допускает введение нецелостных(неверных) данных Вы забыли добавить условие ", чтобы я его понял". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2008, 16:55 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоЭто не словоблудство, а именно особенности реализации ПИ Эти особенности В рамках модели данных или ЗА ними? Напоминаю, мы находимся в "Проектировании БД". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2008, 16:58 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов Как можно было не понять столько четко сформулированный вопрос? 1. Согласно задаче автора, у работы может быть сколь угодно много подразделений (фактически, больше нуля), но обязательно есть одно главное подразделение. 2. Подразделения Б и В не являются главными. 3. Главным является подразделение А. 4. Есть желание главное подразделение указать ПОСЛЕДНИМ среди всех подразделений. До этого никаких главных подразделений нет, ни Б ни В им быть не может. Это не какая-то фантастическая ситуация. Например, главным подразделением является контролирующее подразделение, какое именно оно будет - заранее неизвестно (ОТК). То есть это вполне житейская ситуация, не выходящая за рамки задачи автора. Если с точки зрения предметной области допустимо отсутствие главного подразделения (заранне неизвестно, но станет известно потом), то тогда поле будет необязательным Вы забыли добавить условие ", чтобы я его понял". Юмор твой я не понял :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2008, 17:11 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоЕсли с точки зрения предметной области допустимо отсутствие главного подразделения (заранне неизвестно, но станет известно потом), то тогда поле будет необязательным Потребуется дополнительная проверка на стадии, когда для работы необходимо будет точно знать главное подразделение. Видимо, она будет реализована в виде сообщения об ошибке юзеру "выберите главное подразделение из перечня подразделений", когда тот начнет печатать, например, наряд на работу. Напоминаю про негативное отношение автора вопроса к ручному коду SQL, а также про старика Оккама. Сравните с простейшим решением "npp=0 только для главного подразделения". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2008, 18:11 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Ну так его npp=0 тоже ведь нужно устанваливатью и заранне тоже может быть неизвестно какое главное. Как в этом случае использование npp=0 может облегчить жизнь? Не говоря уже о том что пользователь по не знанию или намеренно может ввести несколько главных из-за чего, например, перестанет рабоать часть функционала. Что тогда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.07.2008, 18:39 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоНу так его npp=0 тоже ведь нужно устанваливатью и заранне тоже может быть неизвестно какое главное Это не принципиально, важно только наличие детерминированной сортировки и принципиальной возможности установить/добавить любое подразделение главным в любой момент, если только заранее сильно не обгадиться. Под "обгадиться" я здесь понимаю, например, установить неглавное подразделение со значением npp=maxint и договоренностью, что главным считается первое подразделение в соответствии с сортировкой order by npp desc,id (это еще и намек, что логику сортировки можно немного "подвигать", пока решение не принято), так что главное со значением maxint+1 уже не удастся вставить. В этом смысле использовать в качестве главного подраздедления запись с максимальным значением npp может оказаться удобнее, даже можно в известной степени npp формировать полуавтоматически начиная с маленьких целых значений. Все очень простоКак в этом случае использование npp=0 может облегчить жизнь? Не говоря уже о том что пользователь по не знанию или намеренно может ввести несколько главных из-за чего, например, перестанет рабоать часть функционала. Что тогда? Из "npp=0 только для главного подразделения" не следует, что "если у подразделения npp=0, то оно главное". Понятно, что тонкости начинаются в тот момент, когда у двух подразделений с претензиями на главенство одинаковое значение npp (и в ощем случае не обязательно равное нулю). А облегчить жизнь это может существенно. Смысл в том, что подчас формализовать что-то сложнее, чем только лишь объяснить это юзеру. Пользователи обычно знают, какое подразделение главное, а какое - нет. И если человек внес неглавное подразделение с npp=0, или два разных человека внесли (каждый свое, как кто думал) главные подразделения с npp=0, главным будет только одно, зато видно будет, кто как и почему обгадился. А то, что перестанет работать часть функционала, как-то не верится, если только заранее не делать слишком сильных допущений. Также как и в Вашем случае, в том месте, где определяется главное подразделение, логика определения главного подразделения должна быть единой. Пусть это отдельное поле, пусть это функция - пока что не принципиально. Важно только, чтобы алгоритм определения главного подразделения возвращал детерминированный результат, не зависящий от настроения админа, фазы луны и тонкостей поднятия дампа. Если это будет реализовано - ничего никогда не отъедет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 09:38 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Я считаю дурным тоном зашивать ассосиации между сущностями (связи) в логику приложения. Очень сложно будет поддерживать такую систему. ИМХО предметная область по возможности должна по максимуму отражаться в модели данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 11:22 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоЯ считаю дурным тоном зашивать ассосиации между сущностями (связи) в логику приложения. Очень сложно будет поддерживать такую систему. ИМХО предметная область по возможности должна по максимуму отражаться в модели данных. В данном сообщении есть внутреннее противоречие. Оно заключается в том, что модель данных всегда зашита в логику приложения. Поэтому деваться некуда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 12:39 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
А вот здесь я тебя не понял. Каким это образом в моем варианте связь "Главное подразделение" зашито в логику приложения? Это же декларативный констрейнт на уровне базы данных и он ни каким образом не зависит ни от какой логики никакого приложения. Это же модель данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 12:56 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов... модель данных всегда зашита в логику приложения...Обычно считается, что МД отделена от приложения. Поясните, пожалуйста Честно говоря, я тоже не до конца понял Ваше решение. Имеем две записи с npp=0. По Вашему - вполне законно. 1. id_cust = 1 2. id_cust = 2 Какое из них главное - то, которое вернет сервер по top 1?.. с order by по какому аттрибуту?.. Ну, допустим, он вернет c id_cust=1, но тут юзер посчитал, что это неправильно, какие ему сделать движения, чтобы главным стал id_cust=2? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 12:59 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоА вот здесь я тебя не понял. Каким это образом в моем варианте связь "Главное подразделение" зашито в логику приложения? Очевидно, в приложении есть ОТДЕЛЬНОЕ ВЫДЕЛЕННОЕ ПОЛЕ для отображения и редактирования ссылки на главное подразделение. Это поле специально сделано для главного подразделения, и если поля в интерфейсе нет, а в модели оно есть, никому от этого легче не станет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 13:01 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Sgt.PepperОбычно считается, что МД отделена от приложения Не знаю, кем это так считается. По-вашему, любое приложение может работать на любой МД? Sgt.PepperКакое из них главное - то, которое вернет сервер по top 1?.. с order by по какому аттрибуту?.. Я же писал примеры. Например, order by npp, id_cust. Или другие, например, с npp desc. Важно только, чтобы npp было первым полем, и чтобы комбинация полей была уникальна. Sgt.PepperНу, допустим, он вернет c id_cust=1, но тут юзер посчитал, что это неправильно, какие ему сделать движения, чтобы главным стал id_cust=2? Очевидно, раз на значение id_cust повлиять нельзя, то надо изменять npp. Например, уменьшить у главного или увеличить у неглавного, если сортировка по npp по возрастанию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 13:05 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей ВаскецовПо-вашему, любое приложение может работать на любой МД? По моему с МД (а лучше сказать просто РБД) может работать несколько приложений именно потому что данные отделены от приложений и это считается большим достижением в инфотехнологиях. Для Вас это новость? Сергей ВаскецовОчевидно, раз на значение id_cust повлиять нельзя, то надо изменять npp. Например, уменьшить у главного или увеличить у неглавного, если сортировка по npp по возрастанию. Так решения нет?.. Вы на ходу придумываете?.. Ну вот Вы говорите в приложении будет поле для главного подразделения. Какие действия с вышеуказанной таблицей должны произойти при его (поля) изменении?.. по шагам, для тупых, пожалуйста... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 13:18 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Sgt.PepperПо моему с МД (а лучше сказать просто РБД) может работать несколько приложений именно потому что данные отделены от приложений и это считается большим достижением в инфотехнологиях. Для Вас это новость? Сравните с тем, что Вы написали Выше ("Обычно считается, что МД отделена от приложения"). По-вашему, данные и модель данных - это одно и то же? Sgt.Pepper Сергей ВаскецовОчевидно, раз на значение id_cust повлиять нельзя, то надо изменять npp. Например, уменьшить у главного или увеличить у неглавного, если сортировка по npp по возрастанию. Так решения нет?.. Вы на ходу придумываете?.. Вообще-то в моем предложении ИЛИ разделяет 2 возможных решения, выбирайте любое, какое нравится. Результат - нужное подразделение станет главным - в обоих случаях будет достижим. И придумываю я не находу, а уже как 2-ю страницу пытаюсь это донести для неумеющих пользоваться глазами и мозгом. Sgt.PepperНу вот Вы говорите в приложении будет поле для главного подразделения. Какие действия с вышеуказанной таблицей должны произойти при его (поля) изменении?.. по шагам, для тупых, пожалуйста... :) Я как раз не говорил, что надо делать отдельно поле для главного подразделения, если это только для галочки, что оно "главное". Но если уж хотите, то при его изменении, видимо, должно выполняться нечто типа update rabota set id_main_cust=N where id_rabota=M. За один шаг. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 13:37 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей ВаскецовПо-вашему, данные и модель данных - это одно и то же? Играть словами и флеймить не будем :) Сергей ВаскецовЯ как раз не говорил, что надо делать отдельно поле для главного подразделения, если это только для галочки, что оно "главное". А здесь? Сергей ВаскецовНо если уж хотите, то при его изменении, видимо, должно выполняться нечто типа update rabota set id_main_cust=N where id_rabota=M. За один шаг. Тут я вообще перестал понимать о чем речь. Ведь началось все с обсуждения вот этой таблицы vitaliy14Нет еще ничего таблицы пустые! Т.е. по пунктам Таблица Работа-ПЗ (подразделение заказчика) ---------------------------------------------- ID_JOB_Customer ID_JOB ID_Customer NPP И Вы утверждали, что атрибут IS_MAIN ни к чему - мы, мол, с помощью top 1 и order by и так выясним кто там MAIN... Здесь А теперь "update rabota set id_main_cust=N where id_rabota=M"? Как все запуталось!.. Так этих атрибутов не достаточно, нужен все-таки id_main_cust?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 14:14 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Sgt.PepperКак все запуталось! Отмечу, после Вашей неверной предпосылки "Ну вот Вы говорите в приложении будет поле для главного подразделения". В случае процитированной Вами таблицы с NPP никакого отдельного поля "Главное подразделение" нет ввиду его ненужности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 14:17 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Sgt.Pepper Сергей ВаскецовЯ как раз не говорил, что надо делать отдельно поле для главного подразделения, если это только для галочки, что оно "главное". А здесь? Это было развитие "конкурирующей" идеи. За нее пусть отвечает ее автор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 14:18 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Я настаиваю что для связи "Главное подразделение" необходимо отдельное поле(внешний ключ). И нужно чтобы пользователь ЯВНО указывал главное подразделение в соотвествии с моделью данных, а не выдумывать какой-то порядок и по нему определять главное подразделение. Это не логично, не очевидно и никак не отражается в модели данных а хранится только в логике приложения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 14:28 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов Sgt.PepperКак все запуталось! Отмечу, после Вашей неверной предпосылки "Ну вот Вы говорите в приложении будет поле для главного подразделения". В случае процитированной Вами таблицы с NPP никакого отдельного поля "Главное подразделение" нет ввиду его ненужности. Просто прелесть!.. Так значит "update rabota set id_main_cust=N" вернет ошибку?.. ОК, но что-то есть, что помогает юзеру сказать "А вот это будет главное"?.. По-моему у Вас вышло бы быстрее если бы Вы вместо последних двух страниц описали последовательность действий :) ну типа: 1. Создаем таблу с полями... бла-бла-бла 2. При добавлении юзером работы... бла-бла-бла 3. При смене главного подразделения... бла-бла-бла 4. .............. 5. .............. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 14:30 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоникак не отражается в модели данных а хранится только в логике приложения. Пожалуй, я пасану. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 14:33 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоЯ настаиваю что для связи "Главное подразделение" необходимо отдельное поле(внешний ключ). И нужно чтобы пользователь ЯВНО указывал главное подразделение в соотвествии с моделью данных, а не выдумывать какой-то порядок и по нему определять главное подразделение. Это не логично, не очевидно и никак не отражается в модели данных а хранится только в логике приложения. согласен, пока что идея Сергея выглядит чем-то весьма экзотическим... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 14:33 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Sgt.PepperПросто прелесть!.. Так значит "update rabota set id_main_cust=N" вернет ошибку?.. Смех без причины? Sgt.PepperОК, но что-то есть, что помогает юзеру сказать "А вот это будет главное"?.. Да. В перечне подразделений оно будет первым. Или последним. Как захотите. Если сделать функцию, возвращающую по работе ее главное подразделение, можно и отдельно его отображать. Sgt.PepperПо-моему у Вас вышло бы быстрее если бы Вы вместо последних двух страниц описали последовательность действий :) По-моему, кто хотел, уже все давно понял. И таблица, и что делать - все давно написано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 14:39 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей ВаскецовСмех без причины? Не, ну правда, Сергей, почему без причины. Вы написали update, который использует несуществующие поля типа id_main_cust. Или оно нужно? Ответьте определенно и тогда разговор можно продолжать в серьезном ключе, без смеха... Сергей ВаскецовПо-моему, кто хотел, уже все давно понял. И таблица, и что делать - все давно написано. Это вообще в стиле ЧАЛа, хоть (с) ставь :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 14:49 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Sgt.Pepper Сергей ВаскецовСмех без причины? Не, ну правда, Сергей, почему без причины. Вы написали update, который использует несуществующие поля типа id_main_cust. Или оно нужно? Ответьте определенно и тогда разговор можно продолжать в серьезном ключе, без смеха... Вы считаете, что каждому новоприходящему в топик я должен все разжевать по новой? Попробуйте прочитать все, невзирая на многабукав. Если это не поможет понять, почему и когда работает то, что я предлагаю, очевидно, объяснение, что нельзя выдергивать фразы из контекста и путать два разных контекста Вам тоже не поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 14:58 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей ВаскецовВы считаете, что каждому новоприходящему в топик я должен все разжевать по новой? Попробуйте прочитать все, невзирая на многабукав. Если это не поможет понять, почему и когда работает то, что я предлагаю, очевидно, объяснение, что нельзя выдергивать фразы из контекста и путать два разных контекста Вам тоже не поможет. Да прочитал я все Ваши многабуков Здесь Вы несколько снисходительно заявили, что есть методы попроще, без IS_MAIN-ов А вот здесь сами его фактически стали использовать в update Не надо ничего разжевывать по новой, просто скажите (да/нет) нужен атрибут id_main_cust в таблице Работа-ПЗ (подразделение заказчика) ---------------------------------------------- ID_JOB_Customer ID_JOB ID_Customer NPP ? Если да/нет опять не прозвучит будем считать "методы попроще" несостоятельными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 15:14 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Sgt.Pepperпросто скажите (да/нет) нужен атрибут id_main_cust в таблице Работа-ПЗ (подразделение заказчика) ---------------------------------------------- ID_JOB_Customer ID_JOB ID_Customer NPP ? не нужен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 16:57 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Sgt.PepperВы несколько снисходительно заявили, что есть методы попроще, без IS_MAIN-ов А вот здесь сами его фактически стали использовать в update По сути npp - это аналог приоритета, а не тупенького is_main, то есть, это обобщение is_main-а. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.08.2008, 16:58 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей ВаскецовДа. В перечне подразделений оно будет первым. Или последним. Как захотите. Если сделать функцию, возвращающую по работе ее главное подразделение, можно и отдельно его отображать. Отлично. Вам ТАК нравится спроектировать GUI. Но у пользователя есть возможность их двигать вверх-вниз?... Одним словом, как бы ни строился пользовательский интерфейс, есть возможность сказать "главное было с id_cust = 2, а теперь пусть будет главным с id_cust = 1" что произойдет с таблицей?... (npp=0 у обеих записей). Я Вас так понял, что всем "неглавным" надо присвоить npp больший, чем у главного?.. одинаковый?.. разный?... В многабукав я не нашел объяснения КАК это должно делаться. Если npp=0 у главного и npp=1 у неглавного, то чем отличается npp от IS_MAIN?... Сергей ВаскецовПо сути npp - это аналог приоритета, а не тупенького is_main, то есть, это обобщение is_main-а. напишите, плиз, корректный update при смене главного подразделения, все сразу встанет на свои места... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2008, 07:51 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Если мы решаем задачу существования главного подразделения, а не ранжирования подразделений в общем виде, то правильнее, IMHO, сделать отдельную таблицу - "Работа-Главное ПЗ" с PRIMARY KEY(ID_JOB) и FOREIGN KEY ON "Работа-ПЗ" (ID_JOB, ID_Customer). В таблице "Работа-ПЗ" для этого нужен либо PRIMARY KEY(ID_JOB, ID_Customer), либо UNIQUE(ID_JOB, ID_Customer) и CHECK (ID_JOB IS NOT NULL AND ID_Customer IS NOT NULL). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2008, 11:33 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
ChAЕсли мы решаем задачу существования главного подразделения, а не ранжирования подразделений в общем виде, то правильнее, IMHO, сделать отдельную таблицу - "Работа-Главное ПЗ" с PRIMARY KEY(ID_JOB) и FOREIGN KEY ON "Работа-ПЗ" (ID_JOB, ID_Customer). В таблице "Работа-ПЗ" для этого нужен либо PRIMARY KEY(ID_JOB, ID_Customer), либо UNIQUE(ID_JOB, ID_Customer) и CHECK (ID_JOB IS NOT NULL AND ID_Customer IS NOT NULL). Правда, тогда для списка ВСЕХ подразделений нужен UNION?... Но интересовали "методы попроще", может быть там есть какое-то рациональное зерно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2008, 15:52 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Sgt.Pepper ChAЕсли мы решаем задачу существования главного подразделения, а не ранжирования подразделений в общем виде, то правильнее, IMHO, сделать отдельную таблицу - "Работа-Главное ПЗ" с PRIMARY KEY(ID_JOB) и FOREIGN KEY ON "Работа-ПЗ" (ID_JOB, ID_Customer). В таблице "Работа-ПЗ" для этого нужен либо PRIMARY KEY(ID_JOB, ID_Customer), либо UNIQUE(ID_JOB, ID_Customer) и CHECK (ID_JOB IS NOT NULL AND ID_Customer IS NOT NULL). Правда, тогда для списка ВСЕХ подразделений нужен UNION?Или я не понял Ваших сомнений, или Вы несколько невнимательно отнеслись к предложенной схеме. Все подразделения и так находятся в таблице "Работа-ПЗ", включая и "главное". В таблице "Работа-Главное ПЗ" есть только факт, которое из них считать главным. Так что необходимость в UNION "для списка ВСЕХ подразделений" отсутствует. Sgt.PepperНо интересовали "методы попроще", может быть там есть какое-то рациональное зерно...На мой взгляд, более-менее вменяемый способ был упомянут ранее , но у него есть сильный недостаток. Для того чтобы обойтись только ограничениями, для таблицы "Работа" надо будет сделать обратный FOREIGN KEY ON "Работа-ПЗ" (ID_JOB, ID_Customer). К сожалению, формально для таблицы "Работа-ПЗ" уже должен быть FOREIGN KEY ON "Работа" (ID_JOB). Т.е., у нас образуется так называемая циклическая связь, что позволяют не все СУБД, да и просто может вызвать сложности с определением, типа, "что раньше - яйцо или курица". Лично я стараюсь избегать таких неоднозначностей в схеме. Если же обратной связи ("Работа-ПЗ"->"Работа") не делать, то возникает риск ввести в качестве главного подразделения то, которое вовсе не участвует в списке допустимых. Если же считать его допустимым, но дополнительным к списку в "Работа-ПЗ", то оно, во-первых, может оказаться дублирующим, во-вторых, для получения списка всех подразделений придется использовать упомянутый Вами UNION. Кроме того, процедура замены главного подразделения может оказаться не очень тривиальной, хотя при наличии транзакций это и не проблема, но по моему глубочайшему убеждению, нужно стремиться, чтобы изменение одного факта выполнялось за минимальной число модифицирующих операций(в идеале за одну). Так что при всей, казалось бы, простоте решения, на мой взгляд, этот вариант не очень привлекателен в реализации. В предложенным мною вариант корректность данных определяется стандартным механизмом ограничений. Надеюсь очевидно, что изменение главного подразделения тоже не вызывает каких-либо сложностей, простейший UPDATE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2008, 18:01 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
ChAИли я не понял Ваших сомнений, или Вы несколько невнимательно отнеслись к предложенной схеме. Все подразделения и так находятся в таблице "Работа-ПЗ", включая и "главное". В таблице "Работа-Главное ПЗ" есть только факт, которое из них считать главным. Так что необходимость в UNION "для списка ВСЕХ подразделений" отсутствует. Согласен, разобрался... Все дальнейшее тоже вполне приемлимо на первый взгляд, хотя и в IS_MAIN или id_cust_main каких-либо непоправимых бед не усматривается. Просто весь спор был попыткой разобраться в экзотическом решении коллеги. А в принципе проблема, как мне кажется, совершенно пустяковая, не стОит четырех страниц :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.08.2008, 20:36 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Sgt.Pepperв IS_MAIN или id_cust_main каких-либо непоправимых бед не усматривается.Смотря что считать бедой, да еще и непоправимой. На мой взгляд, корректность данных должна максимально определяться схемой БД, а не какой-либо последовательностью кода. Оба упомянутых решения как раз требуют написания такого кода. Более того, если правильно помню определения, то решение с IS_MAIN вообще нарушает 4НФ, которая запрещает зависимость кортежей друг от друга. Sgt.PepperА в принципе проблема, как мне кажется, совершенно пустяковая, не стОит четырех страницЛирика и злостный офтоп: проблемы всегда в людях, а для этого и четырех страниц может оказаться маловато :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2008, 01:16 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
ChAЛирика и злостный офтоп: проблемы всегда в людях, а для этого и четырех страниц может оказаться маловато :) Злостный? :) Больше не буду, воля Ваша. А по поводу "проблемы всегда в людях" не то что четыре страницы, цельные библиотеки написаны, вряд ли мы тут с Вами что-то существенное к Гоголю и Достоевскому добавим, простите еще раз за лирику... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.08.2008, 17:55 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Sgt.PepperВам ТАК нравится спроектировать GUI Я начинаю сомневаться в Вашей адекватности. Где-то я давал определенные рекомендации по провектировню GUI, которые бы следовали из предлагаемой мной схемы? Sgt.PepperНо у пользователя есть возможность их двигать вверх-вниз? Безусловно есть. Sgt.Pepperесть возможность сказать "главное было с id_cust = 2, а теперь пусть будет главным с id_cust = 1" что произойдет с таблицей?... (npp=0 у обеих записей) Если предположить главенство подразделения с максимальным npp, то схематично примерно что-то типа update job_cust set npp=(select max(npp)+1) where id_job=N and id_cust = 1, если уж Вы так привязались к этому "id_cust = 1". Если главное подразделение с минимальным npp - аналогично. Также никто не мешает выполнять update job_cust set npp=(case when id_cust=1 then A else B end) where id_cust in (1,2), что тривиально при необходимости строится прямо из приложения, если хочется сделать кнопки для движения подразделений вверх и вниз. Sgt.PepperЯ Вас так понял, что всем "неглавным" надо присвоить npp больший, чем у главного?.. одинаковый?.. разный?... Подумайте еще раз, что Вы написали, и какая цель приследуется при подобном update-е, и какая будет разница, будут ли новые значения npp разными или равными, какие будут последствия. По-моему, я достаточно описал, где и как используется npp, чтобы понять это. Sgt.PepperВ многабукав я не нашел объяснения КАК это должно делаться Вроде как топик не ставит задачей объяснить всем, как пишутся update-ы? Sgt.PepperЕсли npp=0 у главного и npp=1 у неглавного, то чем отличается npp от IS_MAIN?... Именно поэтому это и является расширением IS_MAIN, к которому сводится наложением дополнительных ограничений. Именно поэтому при допущении, что решение с IS_MAIN работает, будет работать и решение с npp. Какие у него плюсы и минусы, использовать ли его, и в каком случае - пусть решает автор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2008, 09:39 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
ChA На мой взгляд, более-менее вменяемый способ был упомянут ранее , но у него есть сильный недостаток. Для того чтобы обойтись только ограничениями, для таблицы "Работа" надо будет сделать обратный FOREIGN KEY ON "Работа-ПЗ" (ID_JOB, ID_Customer). К сожалению, формально для таблицы "Работа-ПЗ" уже должен быть FOREIGN KEY ON "Работа" (ID_JOB). Т.е., у нас образуется так называемая циклическая связь, что позволяют не все СУБД, да и просто может вызвать сложности с определением, типа, "что раньше - яйцо или курица". Лично я стараюсь избегать таких неоднозначностей в схеме. Если же обратной связи ("Работа-ПЗ"->"Работа") не делать, то возникает риск ввести в качестве главного подразделения то, которое вовсе не участвует в списке допустимых. Если же считать его допустимым, но дополнительным к списку в "Работа-ПЗ", то оно, во-первых, может оказаться дублирующим, во-вторых, для получения списка всех подразделений придется использовать упомянутый Вами UNION. Кроме того, процедура замены главного подразделения может оказаться не очень тривиальной, хотя при наличии транзакций это и не проблема, но по моему глубочайшему убеждению, нужно стремиться, чтобы изменение одного факта выполнялось за минимальной число модифицирующих операций(в идеале за одну). Так что при всей, казалось бы, простоте решения, на мой взгляд, этот вариант не очень привлекателен в реализации. В предложенным мною вариант корректность данных определяется стандартным механизмом ограничений. Надеюсь очевидно, что изменение главного подразделения тоже не вызывает каких-либо сложностей, простейший UPDATE. О каких циклических связях вы говорите? Считайте что это абсолютно разные связи: 1 - "Работа-ПЗ" 2 - "Работа-ПЗ"->"Работа" И нет ничего страшного что две таблицы ссылаются друг на друга. А какие СУБД не поодерживают этого? В Ыслучайно не путаете с иерархическими связями(когда сущность ссылается сама на себя) и соотвественно иерахическими запросами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2008, 10:55 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
ChAЕсли мы решаем задачу существования главного подразделения, а не ранжирования подразделений в общем виде, то правильнее, IMHO, сделать отдельную таблицу - "Работа-Главное ПЗ" с PRIMARY KEY(ID_JOB) и FOREIGN KEY ON "Работа-ПЗ" (ID_JOB, ID_Customer). В таблице "Работа-ПЗ" для этого нужен либо PRIMARY KEY(ID_JOB, ID_Customer), либо UNIQUE(ID_JOB, ID_Customer) и CHECK (ID_JOB IS NOT NULL AND ID_Customer IS NOT NULL). А как в этом случае реализовать обязательность связи Главное ПЗ? Зачем делать сложнее если можно сделать проще? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2008, 10:56 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоО каких циклических связях вы говорите?О тех, которые в англоязычных источниках обычно упоминаются как circular. Когда одна сущность ссылается на другую, а та, в свою очередь, ссылается обратно. Формально, это не запрещено, до тех пор пока для этих связей не определены каскадные операции, которые могут породить замкнутый бесконечный цикл в некоторых ситуациях, или наоборот, невозможность модификации, так как изменения в одной таблице будут блокироваться данными в другой таблице, что потребует от СУБД существования не самого простого механизма отложенной(deferrable) проверки ограничений ссылочной целостности. В некоторых источниках подобные связи считаются логическими ошибками проектирования, так как подобные циклы практически всегда могут быть исключены введением(или существованием) вполне корректных дополнительных сущностей. Такие связи не имеют никакого отношения к иерархическим связям, которые конечны по сути своей, так как "глубина" такой связи не может превысить количества элементов участвующих в иерархии. Все очень простоИ нет ничего страшного что две таблицы ссылаются друг на друга.Зависит от ситуации. Вполне может проявится неоднозначность вида "кто на ком стоял ?". IMHO, лучше избегать подобных ситаций, насколько это возможно, хотя готов допустить, что в некоторых случаях такой подход и может оказаться допустимым решением. Все очень простоА какие СУБД не поодерживают этого?Сейчас уже не вспомню, но как-то давно сталкивался, то ли в древних версиях MS SQL, то ли Informix. В MS SQL 2000, например, есть запрещение на включение каскадности одного типа в прямой и обратной связях одновременно. Хотя в рассматриваемом нами примере это вроде и не требуется, посему теоретически им вполне можно пренебречь. Все очень простоА как в этом случае реализовать обязательность связи Главное ПЗ? Зачем делать сложнее если можно сделать проще?Не заметил условия обязательности в постановке топикстартера. Насколько я понял задачу, есть список ПЗ, одно из которых может быть главным. Поэтому вполне логично отделить выбор ПЗ для новой работы от выбора главного из них. Впрочем, это мой поверхностный взгляд на поднятую задачу. Предложенный Вами вариант подразумевает при добавлении работы сразу указать для него подразделение заказчика. 1. Если выбирать его прямо из справочника "ПЗ", то Сергей Васкецов уже упомянул некоторые следствия. 2. Если выбирать его прямо из справочника "Работа-ПЗ", то: а). если поле в таблице "Работа" должно быть не NULL(обязательное значение), то ситуация еще хуже. Надо добавить запись в справочник "Работа-ПЗ", на которую будет ссылка из таблицы "Работа", но мы не можем этого сделать, так как у нас еще не добавлена соотвествующая запись в справочник "Работа". В наличии имеем пат, который придется хитромудро разрешать. Это как раз и есть яркая иллюстрация чреватости циклических связей. б). если поле в таблице "Работа" может быть NULL(необязательное значение), то мы уже не имеем решения задачи "обязательность связи Главное ПЗ". Так как все равно придется делать 3 действия: - добавление записи в справочник "Работа" - потом в справочник "Работа-ПЗ" - и только уж потом установку правильного значения в поле "ГлавПЗ" в соответствующую запись таблицы "Работа". Как уже говорилось, при наличии транзакций это вполне допустимо. Все модифицирующие операции практически те же самые, что и в предлагаемом мною варианте с отдельной таблицей. Различие в наших подходах заключается в том, что Вы пытаетесь замаскировать многоходовку, хотя на уровне пользователя в интерфейсе это все равно будут отдельные логические операции - выбор или добавление нового подразделения заказчика в список "Работа-ПЗ", и только потом уже выбор его в качестве главного. Тогда как мой же вариант соотвествует этим операциям можно сказать явно, один в один. Как мне кажется, можно было бы сказать, что наши варианты различаются смысловой нагрузкой: - ваш - "Для данной работы имеется главное ПЗ" - мой - "одно из ПЗ считается главным для данной работы". Топикстартер волен выбрать любой из этих вариантов, который он посчитает предпочтительным в контексте решения собственной задачи. Но он должен отдавать себе отчет, что в вашем решении по варианту 2б обязательность точно также не будет контролироваться ограничениями, как и в моем варианте. Не буду скрывать, что мой вариант мне нравится больше, хотя бы потому, что лично я настороженно отношусь к NULLABLE-полям в таблице, тем более, что на самом деле они такими по сути не являются, а их значения контролируются неким кодом произвольной сложности. Впрочем, я не призываю следовать тем же курсом и не настаиваю на том, что мой вариант является безусловно и единственно правильным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2008, 15:15 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
ChAНе буду скрывать, что мой вариант мне нравится больше, хотя бы потому, что лично я настороженно отношусь к NULLABLE-полям в таблице, тем более, что на самом деле они такими по сути не являются, а их значения контролируются неким кодом произвольной сложности Еще немаловажен факт, что при отсутствии циклических связей FK могут быть созданы одновременно с созданием таблиц, а не отдельным ALTER-ом потом, даже если СУБД их поддерживает с ограничениями. То есть, нет необходимости дополнительно задумываться над порядком генерации сущностей в скрипте создания БД в случае использования, например, PowerDesigner-а. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2008, 15:23 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
ChA Топикстартер волен выбрать любой из этих вариантов, который он посчитает предпочтительным в контексте решения собственной задачи. Но он должен отдавать себе отчет, что в вашем решении по варианту 2б обязательность точно также не будет контролироваться ограничениями, как и в моем варианте. А обязательность в моем случае легко реализуется путем создание ограничения CHECK и указанеим того что это ограниение отложеное (deferable). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2008, 17:12 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов ChAНе буду скрывать, что мой вариант мне нравится больше, хотя бы потому, что лично я настороженно отношусь к NULLABLE-полям в таблице, тем более, что на самом деле они такими по сути не являются, а их значения контролируются неким кодом произвольной сложности Еще немаловажен факт, что при отсутствии циклических связей FK могут быть созданы одновременно с созданием таблиц, а не отдельным ALTER-ом потом, даже если СУБД их поддерживает с ограничениями. То есть, нет необходимости дополнительно задумываться над порядком генерации сущностей в скрипте создания БД в случае использования, например, PowerDesigner-а. Erwin с этим легко справляется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2008, 17:12 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоErwin с этим легко справляется. Я как бы и не утверждал, что это нереальная проблема вынести создание FK из CREATE TABLE. Все очень простообязательность в моем случае легко реализуется путем создание ограничения CHECK и указанеим того что это ограниение отложеное ( deferable ) Если говорить о реализации CONSTRAINT-ов, лучше всегда приводить конкретный SQL с указанием, на каких СУБД он будет работать и как. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2008, 17:43 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Сергей Васкецов Если говорить о реализации CONSTRAINT-ов, лучше всегда приводить конкретный SQL с указанием, на каких СУБД он будет работать и как. СУБД ORACLE ALTER TABLE table1 ADD CONSTRAINT CHK_table1_PZ_NN CHECK (PZ_ID IS NOT NULL) DEFERRABLE INITIALLY DEFERRED ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2008, 17:55 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоСУБД ORACLE Относительно прочих что-нибудь знаете столько же определенное? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2008, 17:56 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
Все очень простоА обязательность в моем случае легко реализуется путем создание ограничения CHECK и указанеим того что это ограниение отложеное (deferable).Т.е., отложенная проверка ограничения типа NOT NULL ? К моему искреннему сожалению, в MS SQL 2000(топикстартер), 2005, и даже пререлизе 2008 такая возможность отсутствует. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2008, 17:58 |
|
||
|
Несколько связей между двумя таблицами
|
|||
|---|---|---|---|
|
#18+
ChA Т.е., отложенная проверка ограничения типа NOT NULL ? К моему искреннему сожалению, в MS SQL 2000(топикстартер), 2005, и даже пререлизе 2008 такая возможность отсутствует. Мои соболезнования :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2008, 18:05 |
|
||
|
|

start [/forum/topic.php?all=1&fid=32&tid=1543731]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
161ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
151ms |
get tp. blocked users: |
2ms |
| others: | 200ms |
| total: | 556ms |

| 0 / 0 |
