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

Откуда: Жатай->Подольск
Сообщений: 137
Имеем набор табличек в БД.


Table1 (
id int identity
+поля
)
.
.
.
TableN (
id int identity
+поля
)

Все они друг на друга ссылаются, или не ссылаются.

Но есть еще потребность сделать в части этих таблиц такую ссылку, которая бы позволяла ссылаться на любой элемент из любой таблицы.

Варианты:
1. Можно сделать общую табличку:
id_Элемента
id_Таблицы
и в конкретной табличке для организации ссылки использовать также пару полей (id_Ссылка, id_Таблицы)

2. Сделать общую табличку:
id
id_Элемента
id_Таблицы
и в конкретной табличке для организации ссылки ссылаться на эту общую табличку.

В обоих вариантах смущает:
1. Что табличка будет для всех одна и будет постоянная конкуренция за доступ к ней.
2. Количество записей будет равно количеству записей во всех таблицах

Можно конечно добавлять записи в эту общую таблицу только в момент возникновении ссылки.

Как эту задачу можно решить эффективно?
14 мар 13, 13:00    [14047106]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше сделать ?  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
id_Таблицы тянет следствием что вам придется везде писать в динамике. Простой и надежный способ, это классически добавить в нужную таблицу столько форинкеев сколько нужно.
14 мар 13, 13:07    [14047172]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше сделать ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
Разве что наделать N FK на каждую из N таблиц.
Если поле ссылается на TableK, то все остальные ссылки делать NULL.
Проверять, что во всём наборе полей-ссылок не более одного NOT NULL

Но это какие-то пляски с бубном.
Такие экзотические требования говорят о неправильно спроектированной базе.
Кстати, чем больше FK, тем хуже производительность.

P.S. что-то последние два дня столько эксцентричных разработчиков тут появилось.
Нет, чтобы сначала почитать, что сервер больше всего любит, под какие задачи он спроектирован.
14 мар 13, 13:10    [14047198]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше сделать ?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
iap
Нет, чтобы сначала почитать, что сервер больше всего любит, под какие задачи он спроектирован.

чичас , все бросят и начнут читать
14 мар 13, 13:14    [14047214]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше сделать ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
Maxx
iap
Нет, чтобы сначала почитать, что сервер больше всего любит, под какие задачи он спроектирован.

чичас , все бросят и начнут читать
Ну а чо они всё время сервер против шерсти гладят?!
14 мар 13, 13:20    [14047252]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше сделать ?  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
iap
Ну а чо они всё время сервер против шерсти гладят?!

Так это же хорошо, 1 ) ценность того кто знает как правильно гладить - от этого только увеличивается. 2) у того кто неправильно гладит есть шанс все запороть и оно не взлетит (конкуренты будут сзади).
14 мар 13, 13:23    [14047291]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше сделать ?  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
ambarka_max
iap
Ну а чо они всё время сервер против шерсти гладят?!

Так это же хорошо, 1 ) ценность того кто знает как правильно гладить - от этого только увеличивается. 2) у того кто неправильно гладит есть шанс все запороть и оно не взлетит (конкуренты будут сзади).

и, главное, поменьше документации
14 мар 13, 13:47    [14047479]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше сделать ?  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Matroskin,
да нормальный подход
делаем центральную табличку (у нас DOC называется)
делаем табличку взаимных ссылок DOCDOC
во всех прочих табличках заводим поле DOCID смотрящее на DOC
если надо завязать какую-то запись любой таблицы на любую запись другой
то обе эти записи регистрируем в DOC и в DOCDOC завязываем между собой
только работать потом с этим довольно трудно, но это дело привычки
зато универсальный подход. у нас документооборот на таком построен
лично мне такое не совсем нравится, но жизнь заставила к такому придти

если нормальные индексы построить то не будет никакой конкуренции
конечно добавлять надо когда нужно ссылку сделать, нафига пустышки плодить
наличие множественных foreign key сильно подвешивает удаление из центральной таблицы
для этого делаем триггер проверки вместо foreignkey
его можно генерить автоматом

ну вот как-то так
14 мар 13, 14:32    [14047787]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше сделать ?  [new]
Гость333
Member

Откуда:
Сообщений: 3683
leov
табличку взаимных ссылок DOCDOC

Название напомнило систему документооборота DoDocs
14 мар 13, 14:38    [14047827]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше сделать ?  [new]
Matroskin
Member

Откуда: Жатай->Подольск
Сообщений: 137
iap,

Задача:
1. Есть "документ1" сохраняющийся в "таблице1" и "документ2" в "таблице2" (документов, как и таблиц, соответственно, может быть много)

2. Есть таблица в которой хранятся наименование и идентификатор операций, назовем - "операции"

3. Есть таблица, в которую после выполнения операции должна произойти запись идентификатора документа и идентификатора операции, и + время, до кучи.

4. По табличке из п.3 нужно будет строить отчет, что над документом таким то, с таким то наименованием, произошла такая то операция и было это тогда-то.

Как бы Вы решили данную задачу?
14 мар 13, 16:06    [14048380]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше сделать ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
Matroskin
iap,

Задача:
1. Есть "документ1" сохраняющийся в "таблице1" и "документ2" в "таблице2" (документов, как и таблиц, соответственно, может быть много)

2. Есть таблица в которой хранятся наименование и идентификатор операций, назовем - "операции"

3. Есть таблица, в которую после выполнения операции должна произойти запись идентификатора документа и идентификатора операции, и + время, до кучи.

4. По табличке из п.3 нужно будет строить отчет, что над документом таким то, с таким то наименованием, произошла такая то операция и было это тогда-то.

Как бы Вы решили данную задачу?
Очень просто. Хранить все документы в одной таблице с полем "Тип документа"!
Типов может быть и 2 миллиарда, и гораздо больше!
И не плодить новые таблицы при появлении нового типа.
14 мар 13, 16:17    [14048463]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше сделать ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
iap
Matroskin
iap,

Задача:
1. Есть "документ1" сохраняющийся в "таблице1" и "документ2" в "таблице2" (документов, как и таблиц, соответственно, может быть много)

2. Есть таблица в которой хранятся наименование и идентификатор операций, назовем - "операции"

3. Есть таблица, в которую после выполнения операции должна произойти запись идентификатора документа и идентификатора операции, и + время, до кучи.

4. По табличке из п.3 нужно будет строить отчет, что над документом таким то, с таким то наименованием, произошла такая то операция и было это тогда-то.

Как бы Вы решили данную задачу?
Очень просто. Хранить все документы в одной таблице с полем "Тип документа"!
Типов может быть и 2 миллиарда, и гораздо больше!
И не плодить новые таблицы при появлении нового типа.
Собственно говоря, у нас так и сделано.
14 мар 13, 16:18    [14048467]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше сделать ?  [new]
Matroskin
Member

Откуда: Жатай->Подольск
Сообщений: 137
iap,

А как решать проблему того, что у разных доков может быть разный набор полей?

А если изменить задачу, и ссылаться на произвольный док или справочник (понятие дока и справочника в системе различны)?
А вдруг к справочнику еще что-то добавится?

P.S. Не воспринимать как параноидальный бред. Есть реальные задачи, написанные аналитиками. И не всегда получается переубедить изменить постановку.
14 мар 13, 16:27    [14048544]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше сделать ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
Matroskin
iap,

А как решать проблему того, что у разных доков может быть разный набор полей?

А если изменить задачу, и ссылаться на произвольный док или справочник (понятие дока и справочника в системе различны)?
А вдруг к справочнику еще что-то добавится?

P.S. Не воспринимать как параноидальный бред. Есть реальные задачи, написанные аналитиками. И не всегда получается переубедить изменить постановку.
Аналитики не должны совать свой нос в реализацию.
В таблице документов должны быть поля, обеспечивающие документы любого типа.
Просто ненужные - IS NULL. Не думаю, что различий так уж много.
Зато элементарно решаются почти все проблемы. И расширяемо.
14 мар 13, 16:33    [14048591]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше сделать ?  [new]
PaulYoung
Member

Откуда: Москва
Сообщений: 2565
Matroskin
iap,

А как решать проблему того, что у разных доков может быть разный набор полей?

А если изменить задачу, и ссылаться на произвольный док или справочник (понятие дока и справочника в системе различны)?
А вдруг к справочнику еще что-то добавится?

P.S. Не воспринимать как параноидальный бред. Есть реальные задачи, написанные аналитиками. И не всегда получается переубедить изменить постановку.
выделить основные, а специфичные реализовать через метаданные
14 мар 13, 16:35    [14048610]     Ответить | Цитировать Сообщить модератору
 Re: Как лучше сделать ?  [new]
iap
Member

Откуда: Москва
Сообщений: 47084
iap
Matroskin
iap,

А как решать проблему того, что у разных доков может быть разный набор полей?

А если изменить задачу, и ссылаться на произвольный док или справочник (понятие дока и справочника в системе различны)?
А вдруг к справочнику еще что-то добавится?

P.S. Не воспринимать как параноидальный бред. Есть реальные задачи, написанные аналитиками. И не всегда получается переубедить изменить постановку.
Аналитики не должны совать свой нос в реализацию.
В таблице документов должны быть поля, обеспечивающие документы любого типа.
Просто ненужные - IS NULL. Не думаю, что различий так уж много.
Зато элементарно решаются почти все проблемы. И расширяемо.
Можно, конечно, интерпретировать содержимое одних и тех же полей в зависимости от типа.
Но здесь нарушается множество реляционных принципов.
Да и никакой нормализации, честно надо признать.
14 мар 13, 16:35    [14048616]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить