Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 циклические ключи - можно или лучше не надо  [new]
londinium
Member

Откуда: Киев
Сообщений: 1197
Всем здравствуйте,
Имеется
Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (Intel X86) 
	Jun 17 2011 00:57:23 
	Copyright (c) Microsoft Corporation
	Enterprise Edition on Windows NT 5.2 <X86> (Build 3790: Service Pack 2)


и вот такие таблицы:
IF OBJECT_ID(N'dbo.CI_CONTRAGENT',N'U')IS NOT NULL
  DROP TABLE dbo.CI_CONTRAGENT
CREATE TABLE dbo.CI_CONTRAGENT
(
  Contragent_ID INT NOT NULL IDENTITY(1,1)PRIMARY KEY,
  ContragentName VARCHAR(100)NOT NULL,
  AddOperator_ID INT NULL,
  AddDate DATE NOT NULL DEFAULT GETDATE(),
  ChangeOperator_ID INT NULL,
  ChangeDate DATE NOT NULL DEFAULT GETDATE()
);

IF OBJECT_ID(N'dbo.ENT_DEPARTMENTS;',N'U')IS NOT NULL
  DROP TABLE dbo.ENT_DEPARTMENTS;
CREATE TABLE dbo.ENT_DEPARTMENTS
(
  Department_ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
  Contragent_ID INT NOT NULL,
    CONSTRAINT FK_DepartmentContragent
    FOREIGN KEY(Contragent_ID)
    REFERENCES dbo.CI_CONTRAGENT(Contragent_ID),
  DepartmentName VARCHAR(100)NOT NULL,  
);
CREATE TABLE dbo.ENT_OPERATORS
(
  Operator_ID INT NOT NULL IDENTITY(1,1)PRIMARY KEY,
  Department_ID INT NOT NULL,
   CONSTRAINT FK_OperatorDepartment
   FOREIGN KEY(Department_ID)
   REFERENCES dbo.ENT_DEPARTMENTS(Department_ID),
  OperatorSurname VARCHAR(50)NOT NULL,
  OperatorName VARCHAR(50)NOT NULL,
  OperatorMiddleName VARCHAR(70)NOT NULL
)
GO
------------------------
ALTER TABLE dbo.CI_CONTRAGENT
ADD CONSTRAINT FK_ContragentAddOperator
FOREIGN KEY(AddOperator_ID)
REFERENCES dbo.ENT_OPERATORS(Operator_ID);

ALTER TABLE dbo.CI_CONTRAGENT
ADD CONSTRAINT FK_ContragentChangeOperator
FOREIGN KEY(ChangeOperator_ID)
REFERENCES dbo.ENT_OPERATORS(Operator_ID);


т.е Contragent->Department->Operator->Contragent
В результате получилась циклическая связь таблиц.

Вопрос: можно ли так сделать и не получить проблем при разворачивании из бэкапа или настройке репликации таких таблиц или лучше не надо?
20 ноя 14, 00:02    [16875445]     Ответить | Цитировать Сообщить модератору
 Re: циклические ключи - можно или лучше не надо  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
londinium,

разворачивание из бэкапа по моему вообще не это не смотрит
а констрейнты у меня почему-то все Not for replication (не помню уже почему но так сложилось)
типа на основной базе проверились, дак чего на запасной еще раз проверять
20 ноя 14, 03:14    [16875751]     Ответить | Цитировать Сообщить модератору
 Re: циклические ключи - можно или лучше не надо  [new]
Klemzig
Guest
londinium,

А какой физический смысл у вас вкладывается в таблицу департаментов, если она зависит от контрагентов?

А так, абстрактно... сделать конечно можно, но геморроя получите - мало не покажется.
20 ноя 14, 03:21    [16875753]     Ответить | Цитировать Сообщить модератору
 Re: циклические ключи - можно или лучше не надо  [new]
londinium
Member

Откуда: Киев
Сообщений: 1197
автор
сделать конечно можно, но геморроя получите - мало не покажется.

Какой геморрой потенциально возможен?
20 ноя 14, 10:16    [16876446]     Ответить | Цитировать Сообщить модератору
 Re: циклические ключи - можно или лучше не надо  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
londinium,

можно предположить что просто была неудачная постановка задачи
которая привела к странной запутанной структуре
сама структура то ничем не плоха и вполне себе может существовать
20 ноя 14, 10:36    [16876587]     Ответить | Цитировать Сообщить модератору
 Re: циклические ключи - можно или лучше не надо  [new]
londinium
Member

Откуда: Киев
Сообщений: 1197
автор
можно предположить что просто была неудачная постановка задачи
которая привела к странной запутанной структуре

Да вроде ничего особого в постановке нет: в таблице CI_Contragent объединены как наши клиенты, так и мы сами. У нас есть отделы в организации dbo.ENT_DEPARTMENTS и сотрудники dbo.ENT_OPERATORS. Одновременно для учета надо знать, кто вводил и менял контрагентов.
20 ноя 14, 10:50    [16876683]     Ответить | Цитировать Сообщить модератору
 Re: циклические ключи - можно или лучше не надо  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21100
Ага... а потом на это дело ещё каскадное удаление навесить... и гадать, почему удаление одного контрагента почистило всю базу.
20 ноя 14, 10:53    [16876702]     Ответить | Цитировать Сообщить модератору
 Re: циклические ключи - можно или лучше не надо  [new]
Glory
Member

Откуда:
Сообщений: 104751
londinium
Да вроде ничего особого в постановке нет: в таблице CI_Contragent объединены как наши клиенты, так и мы сами. У нас есть отделы в организации dbo.ENT_DEPARTMENTS и сотрудники dbo.ENT_OPERATORS. Одновременно для учета надо знать, кто вводил и менял контрагентов.

Почему Contragent-ы и Operator-ы не могут быть в одной таблице ? И делиться по некому полу Тип ?
20 ноя 14, 10:53    [16876707]     Ответить | Цитировать Сообщить модератору
 Re: циклические ключи - можно или лучше не надо  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21100
londinium
в таблице CI_Contragent объединены как наши клиенты, так и мы сами.
Чё за фигня?
Тут не одна сущность, а три. Люди, работники, контрагенты.
20 ноя 14, 10:55    [16876723]     Ответить | Цитировать Сообщить модератору
 Re: циклические ключи - можно или лучше не надо  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21100
Glory
Почему Contragent-ы и Operator-ы не могут быть в одной таблице ? И делиться по некому полу Тип ?
А кто сказал, что один и тот же чел не может быть и контрагентом (по основному месту работы), и оператором (по совместительству)?
20 ноя 14, 10:57    [16876746]     Ответить | Цитировать Сообщить модератору
 Re: циклические ключи - можно или лучше не надо  [new]
Glory
Member

Откуда:
Сообщений: 104751
Akina
Glory
Почему Contragent-ы и Operator-ы не могут быть в одной таблице ? И делиться по некому полу Тип ?
А кто сказал, что один и тот же чел не может быть и контрагентом (по основному месту работы), и оператором (по совместительству)?

А причем тут еще люди. Контрагент и Оператор - это скорее должности.
А Люди вообще отдельно должны быть.
20 ноя 14, 11:01    [16876789]     Ответить | Цитировать Сообщить модератору
 Re: циклические ключи - можно или лучше не надо  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21100
Именно! потому я и говорю - три сущности.
20 ноя 14, 11:09    [16876853]     Ответить | Цитировать Сообщить модератору
 Re: циклические ключи - можно или лучше не надо  [new]
iap
Member

Откуда: Москва
Сообщений: 47083
Akina
Ага... а потом на это дело ещё каскадное удаление навесить... и гадать, почему удаление одного контрагента почистило всю базу.
При наличии циклических ссылок сервер откажется создавать FK с каскадным удалением.
20 ноя 14, 11:16    [16876924]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить