|
|
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
допустим есть такие таблицы (естественно, здесь только нужные для понимания моей проблемы столбцы; определения писал вручную, возможны ошибки, но думаю, суть понятна) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Для общего понимания: я - любитель, базу делаю на Аксессе для приятеля, записей будет мало, но хочу сделать по возможности грамотно. Прошу помочь, у кого есть идея, как это реализовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2009, 17:14 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
1. храни ид договора дополнительно в таблице 2. внешние ключи делай по двум полям ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2009, 18:38 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
Sator Arepoкак это реализовать.Где-то так Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2009, 19:13 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
авторбазу делаю на Аксессе ... Хочу констрейнт (внешний ключ? уникальный индекс? CHECK?) на эту таблицу, который бы не давал вводить запись с документом и платежом, относящимся к разным договорам. Вроде так работает Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2009, 20:57 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
ChA............ Код: plaintext 1. 2. 3. 4. 5. 6. Спасибо за ответ - и за тонкий намек поменять мой стиль наименования на Ваш :-) . Что есть первичный ключ в таблице Payment_Doc? По поводу ключей в моих таблицах: в реальности они и есть автосчетчики. Пытался упростить объяснение и опустить ненужные с моей точки зрения детали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2009, 23:20 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
Restavraciyaавторбазу делаю на Аксессе ... Хочу констрейнт (внешний ключ? уникальный индекс? CHECK?) на эту таблицу, который бы не давал вводить запись с документом и платежом, относящимся к разным договорам. Вроде так работает Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Реставрация, спасибо, попробую - чувствую, что это то, что мне надо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2009, 23:21 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
Sator Arepoза тонкий намек поменять мой стиль наименования на ВашДаже и не думал, это просто привычка. Sator ArepoЧто есть первичный ключ в таблице Payment_Doc?Sorry, забыл. Так как подразумевалась уникальность ID только в комбинации с Contract_ID, то, пожалуй, так - PRIMARY KEY(Contract_ID, Payment_ID, Doc_ID). В то же время, если ID в соответствующих таблицах уникальны сами по себе, то вполне будет достаточно комбинации (Payment_ID, Doc_ID). Тогда, пожалуй, схему лучше изобразить так Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 01:12 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
Sator Arepo, Не забудь установить "птичку" Синтаксис для SQL Server ANSI-92 (Сервис - Параметры - Таблицы и запросы) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 06:04 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
Всем спасибо, пока остановился на внешнем ключе: добавил все-таки (не хотелось, т.к. казался избыточным) столбец Contract_nbr в таблицу Payments_docs, добавил по уникальному индексу в таблицы Docs и Payments на Doc_nbr, Contract_nbr и Payment_nbr, Contract_nbr и сделал на них ссылки. Т.е. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. Как-то оно прозрачнее, чем CHECK. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 11:29 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
Прошу прошения за тупость - а как вы его (Contract_nbr) в крос таблицу загоняете ? Не иначе как клиентом .. ? Танец живота под бубен ? Просвятите - может и мне вкусно будет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 12:13 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
RestavraciyaПрошу прошения за тупость - а как вы его (Contract_nbr) в крос таблицу загоняете ? Не иначе как клиентом .. ? Танец живота под бубен ? Просвятите - может и мне вкусно будет Пока никак. Придется клиентом - так что вкусно не будет Поэтому и не хотел - все-таки вроде как денормализация - причем на начальном этапе. То ли я чего перемудрил.... То ли недомудрил... То ли это не денормализация... Окончательно еще не решил. Твой CHECK до конца еще не проверил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 12:46 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
Даже больше - CHECK в JET-SQL позволяет использовать public function А уж в ней ты можешь проверить хоть расположение звезд ;-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 13:12 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
RestavraciyaДаже больше - CHECK в JET-SQL позволяет использовать public function А уж в ней ты можешь проверить хоть расположение звезд ;-)... (с) Бенедикт (по сути предмета) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 13:13 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
вроде как денормализация Ну да. В Payments_docs нарушение 2НФ выходит. Contract_nbr ведь от атрибутов payment_nbr, doc_nbr по отдельности зависит. Не очень удачно. А какие могут быть платежные документы, что между документами и платежами связь 'многие-ко-многим'? Может, стоит вообще как-нибудь по-другому сущности выделить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 14:55 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
Золотая рыбкаА какие могут быть платежные документы, что между документами и платежами связь 'многие-ко-многим'? Может, стоит вообще как-нибудь по-другому сущности выделить? тиипичная организационно-финансово-налогово-бухгалтерская проблема у одного заказчика несколько договоров, и платить он умудряется одной платёжкой по нескольким договорам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 15:48 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
Sator Arepo, А зачем вообще нужна таблица Payments_docs? Можно просто давить нужные поля в Contracts, либо создать еще одну таблицу которая будет отношением многие к одному к таблице Contracts (ну это для того чтобы не были пустые поля) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 16:06 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
АнатоЛойЗолотая рыбкаА какие могут быть платежные документы, что между документами и платежами связь 'многие-ко-многим'? Может, стоит вообще как-нибудь по-другому сущности выделить? тиипичная организационно-финансово-налогово-бухгалтерская проблема у одного заказчика несколько договоров, и платить он умудряется одной платёжкой по нескольким договорам Даже само собой. Но, ведь и одному документу (не договору) могут соответствовать несколько платежей и один платеж может быть распределен на несколько документов - и при все это может быть в рамках одного договора. Так что многие-ко-многим здесь нужны даже без учета разгильдяйства. ИМХО. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 16:06 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
olzhasSator Arepo, А зачем вообще нужна таблица Payments_docs? Можно просто давить нужные поля в Contracts, либо создать еще одну таблицу которая будет отношением многие к одному к таблице Contracts (ну это для того чтобы не были пустые поля) Как-то пока не догоняю. Может быть схемкой/скриптом объясните? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 16:09 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
Sator ArepoТак что многие-ко-многим здесь нужны даже без учета разгильдяйства. Я в курсе. Это я Золотой рыбке в качестве примера пытался показать... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 16:09 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
АнатоЛойSator ArepoТак что многие-ко-многим здесь нужны даже без учета разгильдяйства. Я в курсе. Это я Золотой рыбке в качестве примера пытался показать... Да это я скорее себя пытался еще раз убедить... А то вдруг действительно многие-ко-многим излишество ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 16:18 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
Золотая рыбкавроде как денормализация В Payments_docs нарушение 2НФ выходит. Contract_nbr ведь от атрибутов payment_nbr, doc_nbr по отдельности зависит.+1. Неключевой атрибут зависит только от части любого из возможных ключей. Поэтому Contract_nbr должен входить в состав ключа, чтобы всё было по честному. Но тогда, чисто формально, мигрировать должны составные ключи, уникальность которых, в данном случае, определяется обоими полями, а не одним из них. Т.е., уникальность payment_nbr или doc_nbr должна обеспечиваться только в комбинации с Contract_nbr. К сожалению, это не так, потому что и payment_nbr и doc_nbr в "родных" таблицах явно подразумеваются "уникальными", т.е., простыми ключами. Таким образом в эти таблицы должны быть введены поля, характеризующие уникальность только в рамках контракта, в результате чего появится новый, составной, ключ, который и должен будет мигрировать в таблицу Payments_docs. В этом случае, нарушения 2NF будет устранено. С другой стороны, чисто в практических целях иногда можно пренебречь некоторыми принципами, чтобы получить нужное ограничение. В данном случае серьёзных последствий от такого нарушения не будет, IMHO. P.S. Лично я попытался бы пойти по первому пути, т.е., поиска уникальности в рамках контракта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 16:43 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
ChAЗолотая рыбкавроде как денормализация В Payments_docs нарушение 2НФ выходит. Contract_nbr ведь от атрибутов payment_nbr, doc_nbr по отдельности зависит.+1. Неключевой атрибут зависит только от части любого из возможных ключей. Поэтому Contract_nbr должен входить в состав ключа, чтобы всё было по честному. Но тогда, чисто формально, мигрировать должны составные ключи, уникальность которых, в данном случае, определяется обоими полями, а не одним из них. Т.е., уникальность payment_nbr или doc_nbr должна обеспечиваться только в комбинации с Contract_nbr. К сожалению, это не так, потому что и payment_nbr и doc_nbr в "родных" таблицах явно подразумеваются "уникальными", т.е., простыми ключами. Таким образом в эти таблицы должны быть введены поля, характеризующие уникальность только в рамках контракта, в результате чего появится новый, составной, ключ, который и должен будет мигрировать в таблицу Payments_docs. В этом случае, нарушения 2NF будет устранено. С другой стороны, чисто в практических целях иногда можно пренебречь некоторыми принципами, чтобы получить нужное ограничение. В данном случае серьёзных последствий от такого нарушения не будет, IMHO. P.S. Лично я попытался бы пойти по первому пути, т.е., поиска уникальности в рамках контракта. Т.е. CHECK? Или что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 16:48 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
Sator ArepoТ.е. CHECK? Или что?Собственно, простейший вариант здесь . В таблицах Payment и Doc поле ID не считается уникальным, уникальны только их комбинации с Contract_ID (см. PRIMARY KEY). Т.е., ID это как бы номер оплаты или документа в рамках одного контракта и для разных Contract_ID значение ID запросто может повторяться. Поле ID можно заменить на любое другое, лишь бы его уникальность подразумевалась в рамках контракта. Ну, например, дата оплаты или получения документа. Возможно в полях Payment_nbr или Doc_nbr подразумевается контракт и состоит из пары частей типа ("Контракт №" + "№ документа по контракту"), тогда из него можно удалить "Контракт №", оставив часть "№ документа по контракту", которая будет уникальна только в комбинации с Contract_ID. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 17:18 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
Исправляю ссылку . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 17:22 |
|
||
|
констрейнт на таблицу
|
|||
|---|---|---|---|
|
#18+
АнатоЛойу одного заказчика несколько договоров, и платить он умудряется одной платёжкой по нескольким договорам Sator Arepoодному документу (не договору) могут соответствовать несколько платежей и один платеж может быть распределен на несколько документов - и при все это может быть в рамках одного договора Да, Вы правы. Я уже забыла, как платежное поручение выглядит... давно его не видела. Так с учетом вышесказанного как вариант: Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2009, 17:24 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=85&tid=1543146]: |
0ms |
get settings: |
10ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
81ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 243ms |
| total: | 453ms |

| 0 / 0 |
