|
Добавить к таблицам одну общую
|
|||
---|---|---|---|
#18+
Добрый день! Подскажите, пожалуйста, как правильно реализовать такое: есть сложившаяся БД с N таблицами. У всех таблиц первичный ключ - int с инкрементом, это менять нельзя. Нужно создать еще одну общую таблицу, где бы хранилась информация (на подобии вложений) для каждого объекта из N таблиц. Число таких "вложений": ни одного, одно или несколько. То есть таблица должна выглядеть как-то так: ID | имя_таблицы | ID_из_таблицы | данные_вложения Таким образом, по связке [имя_таблицы + ID_из_таблицы] можно найти все вложения конкретного объекта в конкретной таблице. Но как в этом случае установить связи и правильно ли так делать, добавлять некое имя таблицы? К N таблицам могут быть добавлены еще несколько по аналогии, то есть идея с именем (текстовым идентификатором) мне не очень нравится, но может это и правильно и так делают. Думал перейти на UID-ы: в каждой из N таблиц добавил бы поле с UID-ом, а в таблице с вложениями вместо пары "имя_таблицы - ID из таблицы" ввел бы тоже поле UID и как-то бы связал их. Тут уже есть подводный камень (может его можно обойти) - связь будет не по первичному ключу. То есть поле с UID'ом бы сделать первичным ключом, но это по условиям нельзя сделать. P.S.: добавление вложений планируется реализовываться с помощью C# и Entity Framework. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2017, 09:33 |
|
Добавить к таблицам одну общую
|
|||
---|---|---|---|
#18+
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.08.2017, 10:55 |
|
Добавить к таблицам одну общую
|
|||
---|---|---|---|
#18+
Ваш второй вариант можно модифицировать, добавив глобальную таблицу (UID primary key), проставив на нее ссылки из "обьектных" таблиц и связав с ней внешним ключом таблицу вложений. В результате уйдет смущающая Вас связь не по PК и появится какая-никакая ссылочная целостность - она не защитит от путаницы вложений между объектами, но хотя бы защитит от вставки совсем "левого" UID-а в таблицу вложений. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2017, 11:13 |
|
Добавить к таблицам одну общую
|
|||
---|---|---|---|
#18+
Qwe.Qwe1 , напрасно Вы не указали СУБД и её версию - на разных диалектах всё придётся реализовывать по-разному, специфично. Достаточно значим также вопрос, важен ли порядок вложений, если их более одного к одному документу. Целостность данных штатными средствами поддерживать не удастся. Если требуется постоянный контроль - только триггерная логика, если бизнес-логика допускает "провалы" без фатальных последствий для клиентской части, то можно обойтись процедурами обслуживания с контролем целостности. Полагаться только на клиентскую бизнес-логику я бы не советовал... Qwe.Qwe1есть подводный камень (может его можно обойти) - связь будет не по первичному ключу.А не пофиг? был бы индекс, а первичный он или нет - это величина второго порядка. stomskyтвой вариант со структурой Qwe.Qwe1 ID | имя_таблицы | ID_из_таблицы | данные_вложения мне кажется неизбежным. Мне кажется более правильным введение в структуру ведущей суммарной таблицы документов (UID - имя таблица - ID записи), и соответственно ссылающуюся на неё по FK таблицу вложений (UID - номер вложения - тело вложения). Если порядок вложений не определён, то поле номера вложения не требуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2017, 11:23 |
|
Добавить к таблицам одну общую
|
|||
---|---|---|---|
#18+
Кот МатроскинВаш второй вариант можно модифицировать, добавив глобальную таблицу (UID primary key), проставив на нее ссылки из "обьектных" таблиц и связав с ней внешним ключом таблицу вложений +1 Правда в этом случае именно тип UID будет уже не нужен. Хватит банального INT И еще нюанс. Кот Матроскин не указал явно (наверное фраза "проставив на нее ссылки" это подразумевает?) что между предложенной им глобальной таблицей "объектными" таблицами надо будет тоже сделать внешний ключ? В этом случае, логику вставки строк в "объектные" таблицы придется модифицировать: перед вставкой строки в "объектную" таблицу надо будет вставить строку в "глобальную" таблицу, чтобы получить ID для связи с вложениями. Изменение кода вставки строк в "объектные" таблицы допускается постановкой задачи? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2017, 11:31 |
|
Добавить к таблицам одну общую
|
|||
---|---|---|---|
#18+
stomskyИ еще нюанс. Кот Матроскин не указал явно (наверное фраза "проставив на нее ссылки" это подразумевает?) что между предложенной им глобальной таблицей "объектными" таблицами надо будет тоже сделать внешний ключ? В этом случае, логику вставки строк в "объектные" таблицы придется модифицировать: перед вставкой строки в "объектную" таблицу надо будет вставить строку в "глобальную" таблицу, чтобы получить ID для связи с вложениями. Изменение кода вставки строк в "объектные" таблицы допускается постановкой задачи? Это необязательно - вполне можно сделать поле uid в "объектной" таблице nullable, вставлять без всяких изменений, а вот когда надо добавить вложение, проверять "поле-ссылка is null?", и если таки да, то вставлять запись в глобальную uid-таблицу, прописывать полученный uid в объектную таблицу и делать вставку в таблицу вложений. Вставлять изначально, как Вы предлагаете, конечно, аккуратнее, но именно из-за больших изменений в существующем коде может быть неоптимально. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2017, 11:43 |
|
Добавить к таблицам одну общую
|
|||
---|---|---|---|
#18+
СУБД MS SQL Server 2014. Идеально, если логика вставки будет максимально переложена на плечи Entity Framework. Если бы удалось сделать так, чтобы в модели данных для каждой из N таблиц появилась бы связь (т.н. "навигационное свойство") к таблице с вложениями, то, вставка данных была бы простой. Ну а если надо будет таки "вручную" вставлять/удалять вложения, буду думать как это делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2017, 11:45 |
|
Добавить к таблицам одну общую
|
|||
---|---|---|---|
#18+
Qwe.Qwe1Если бы удалось сделать так, чтобы в модели данных для каждой из N таблиц появилась бы связь (т.н. "навигационное свойство") к таблице с вложениями, то, вставка данных была бы простой. Тогда лично я поддерживаю вариант Матроскина. Остается только решить нужны ли FOREIGN KEY's между "глобальной" и "объектными" таблицами. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2017, 12:01 |
|
|
start [/forum/topic.php?fid=32&msg=39513294&tid=1540138]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
140ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
others: | 243ms |
total: | 473ms |
0 / 0 |