Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Проектирование БД Новый топик    Ответить
 Добавить к таблицам одну общую  [new]
Qwe.Qwe1
Member

Откуда:
Сообщений: 187
Добрый день! Подскажите, пожалуйста, как правильно реализовать такое: есть сложившаяся БД с N таблицами. У всех таблиц первичный ключ - int с инкрементом, это менять нельзя. Нужно создать еще одну общую таблицу, где бы хранилась информация (на подобии вложений) для каждого объекта из N таблиц. Число таких "вложений": ни одного, одно или несколько. То есть таблица должна выглядеть как-то так:
ID | имя_таблицы | ID_из_таблицы | данные_вложения
Таким образом, по связке [имя_таблицы + ID_из_таблицы] можно найти все вложения конкретного объекта в конкретной таблице.
Но как в этом случае установить связи и правильно ли так делать, добавлять некое имя таблицы? К N таблицам могут быть добавлены еще несколько по аналогии, то есть идея с именем (текстовым идентификатором) мне не очень нравится, но может это и правильно и так делают.

Думал перейти на UID-ы: в каждой из N таблиц добавил бы поле с UID-ом, а в таблице с вложениями вместо пары "имя_таблицы - ID из таблицы" ввел бы тоже поле UID и как-то бы связал их. Тут уже есть подводный камень (может его можно обойти) - связь будет не по первичному ключу. То есть поле с UID'ом бы сделать первичным ключом, но это по условиям нельзя сделать.

P.S.: добавление вложений планируется реализовываться с помощью C# и Entity Framework.
31 авг 17, 09:33    [20760635]     Ответить | Цитировать Сообщить модератору
 Re: Добавить к таблицам одну общую  [new]
stomsky
Member

Откуда: Волгоград
Сообщений: 129
Qwe.Qwe1
как правильно реализовать такое

Строго говоря, "правильно" - правильно так как тебе удобно будет с этим работать.
Насколько я понимаю, ты пытаешься вклинить дополнительный функционал в уже существующую систему. Причем сделать это так, чтобы гарантированно не поломать старый код.
Такие вещи не всегда получается реализовать "красиво". Поэтому исходи из критерия "удобно".

Qwe.Qwe1
То есть таблица должна выглядеть как-то так:
ID | имя_таблицы | ID_из_таблицы | данные_вложения
Таким образом, по связке [имя_таблицы + ID_из_таблицы] можно найти все вложения конкретного объекта в конкретной таблице.

Как вариант, можно еще завести отдельную таблицу "Справочник таблиц", в который ты занесешь имена всех своих N таблиц и присвоишь им коды (те же INT IDENTITY). А затем в "таблице вложений" вместо столбца "имя_таблицы" добавишь столбце "ID_таблицы". Ну и, естественно, "СправочникТаблиц" надо будет связать с "ТаблицейВложений" внешним ключом по ID_таблицы. Это не обязательно, просто как вариант. При большом количестве вложений это позволит сэкономить место.

Qwe.Qwe1
Но как в этом случае установить связи и правильно ли так делать

Если ты под связями подразумеваешь внешние ключи (FOREIGN KEY), то никак. Это придется разруливать в бизнес-логике (ну или с триггерами можно попробовать заморочиться, чего я бы делать не стал).

Qwe.Qwe1
Думал перейти на UID-ы: в каждой из N таблиц добавил бы поле с UID-ом, а в таблице с вложениями вместо пары "имя_таблицы - ID из таблицы" ввел бы тоже поле UID и как-то бы связал их.

Думаю, не получится. У тебя получается одна таблица "Вложений" на множество (N штук) таблиц данных. Получается, что первичный ключ должен быть в таблице "Вложений", а не в этих N таблицах.
Но, т.к. ты сам пишешь, что:
Qwe.Qwe1
Число таких "вложений": ни одного, одно или несколько.

То и этот вариант (когда Master-таблицей становится таблица "Вложений") не прокатит.

В общем, твой вариант со структурой
Qwe.Qwe1
ID | имя_таблицы | ID_из_таблицы | данные_вложения

мне кажется неизбежным. Может быть только с модификацией касающейся выделенного "Справочника таблиц". Но нужен ли он - это тебе виднее.
31 авг 17, 10:55    [20761006]     Ответить | Цитировать Сообщить модератору
 Re: Добавить к таблицам одну общую  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 7684
Ваш второй вариант можно модифицировать, добавив глобальную таблицу (UID primary key),
проставив на нее ссылки из "обьектных" таблиц и связав с ней внешним ключом таблицу вложений. В результате уйдет смущающая Вас связь не по PК и появится какая-никакая ссылочная целостность - она не защитит от путаницы вложений между объектами, но хотя бы защитит от вставки совсем "левого" UID-а в таблицу вложений.
31 авг 17, 11:13    [20761105]     Ответить | Цитировать Сообщить модератору
 Re: Добавить к таблицам одну общую  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 16245
Qwe.Qwe1, напрасно Вы не указали СУБД и её версию - на разных диалектах всё придётся реализовывать по-разному, специфично.
Достаточно значим также вопрос, важен ли порядок вложений, если их более одного к одному документу.
Целостность данных штатными средствами поддерживать не удастся. Если требуется постоянный контроль - только триггерная логика, если бизнес-логика допускает "провалы" без фатальных последствий для клиентской части, то можно обойтись процедурами обслуживания с контролем целостности. Полагаться только на клиентскую бизнес-логику я бы не советовал...
Qwe.Qwe1
есть подводный камень (может его можно обойти) - связь будет не по первичному ключу.
А не пофиг? был бы индекс, а первичный он или нет - это величина второго порядка.
stomsky
твой вариант со структурой
Qwe.Qwe1
ID | имя_таблицы | ID_из_таблицы | данные_вложения

мне кажется неизбежным.

Мне кажется более правильным введение в структуру ведущей суммарной таблицы документов (UID - имя таблица - ID записи), и соответственно ссылающуюся на неё по FK таблицу вложений (UID - номер вложения - тело вложения). Если порядок вложений не определён, то поле номера вложения не требуется.
31 авг 17, 11:23    [20761141]     Ответить | Цитировать Сообщить модератору
 Re: Добавить к таблицам одну общую  [new]
stomsky
Member

Откуда: Волгоград
Сообщений: 129
Кот Матроскин
Ваш второй вариант можно модифицировать, добавив глобальную таблицу (UID primary key), проставив на нее ссылки из "обьектных" таблиц и связав с ней внешним ключом таблицу вложений

+1
Правда в этом случае именно тип UID будет уже не нужен. Хватит банального INT

И еще нюанс. Кот Матроскин не указал явно (наверное фраза "проставив на нее ссылки" это подразумевает?) что между предложенной им глобальной таблицей "объектными" таблицами надо будет тоже сделать внешний ключ? В этом случае, логику вставки строк в "объектные" таблицы придется модифицировать: перед вставкой строки в "объектную" таблицу надо будет вставить строку в "глобальную" таблицу, чтобы получить ID для связи с вложениями.
Изменение кода вставки строк в "объектные" таблицы допускается постановкой задачи?
31 авг 17, 11:31    [20761176]     Ответить | Цитировать Сообщить модератору
 Re: Добавить к таблицам одну общую  [new]
Кот Матроскин
Member

Откуда: Москва
Сообщений: 7684
stomsky
И еще нюанс. Кот Матроскин не указал явно (наверное фраза "проставив на нее ссылки" это подразумевает?) что между предложенной им глобальной таблицей "объектными" таблицами надо будет тоже сделать внешний ключ? В этом случае, логику вставки строк в "объектные" таблицы придется модифицировать: перед вставкой строки в "объектную" таблицу надо будет вставить строку в "глобальную" таблицу, чтобы получить ID для связи с вложениями.
Изменение кода вставки строк в "объектные" таблицы допускается постановкой задачи?

Это необязательно - вполне можно сделать поле uid в "объектной" таблице nullable, вставлять без всяких изменений, а вот когда надо добавить вложение, проверять "поле-ссылка is null?",
и если таки да, то вставлять запись в глобальную uid-таблицу, прописывать полученный uid в объектную таблицу и делать вставку в таблицу вложений.
Вставлять изначально, как Вы предлагаете, конечно, аккуратнее, но именно из-за больших изменений в существующем коде может быть неоптимально.
31 авг 17, 11:43    [20761226]     Ответить | Цитировать Сообщить модератору
 Re: Добавить к таблицам одну общую  [new]
Qwe.Qwe1
Member

Откуда:
Сообщений: 187
СУБД MS SQL Server 2014. Идеально, если логика вставки будет максимально переложена на плечи Entity Framework. Если бы удалось сделать так, чтобы в модели данных для каждой из N таблиц появилась бы связь (т.н. "навигационное свойство") к таблице с вложениями, то, вставка данных была бы простой. Ну а если надо будет таки "вручную" вставлять/удалять вложения, буду думать как это делать.
31 авг 17, 11:45    [20761243]     Ответить | Цитировать Сообщить модератору
 Re: Добавить к таблицам одну общую  [new]
stomsky
Member

Откуда: Волгоград
Сообщений: 129
Qwe.Qwe1
Если бы удалось сделать так, чтобы в модели данных для каждой из N таблиц появилась бы связь (т.н. "навигационное свойство") к таблице с вложениями, то, вставка данных была бы простой.

Тогда лично я поддерживаю вариант Матроскина.
Остается только решить нужны ли FOREIGN KEY's между "глобальной" и "объектными" таблицами.
31 авг 17, 12:01    [20761294]     Ответить | Цитировать Сообщить модератору
Все форумы / Проектирование БД Ответить