|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
a_voronin Есть способы построить БД так и следовать шаблонам написания кода так, что никакой контроллер не нужен. Я говорю о ХД. В OLTP как правило есть небольшое число таблиц большого размера, где это критично и там надо написать некоторое кол-во кода, который надо хорошо проверить и протестировать и который для ускорения работает без констрейнтов. Одно дело, если вы проводите платежи, другие дело, если вы скидывает информацию в исторический лог, где эти констрейнты никому не нужны. Вообще введение принципа -- ничего не удалять, только метить DELETED = 1 это шаг к тому, чтобы избавиться от внешних ключей. Программисты и администраторы обязательно допускают ошибки, среди поколений менеджеров обязательно найдутся такие, которые будут платить за строки кода, или будут под давлением своих начальников давить на программистов, внедряя костылями важную фичу. Ссылочная целостность не гарантирует отсутствие ошибок вообще, но защищает хотя бы от части ошибок. Безусловно, можно не использовать декларативную ссылочную целостность, но это решение принимается всегда из соображений затраты/профит, а не тупо "она не нужна", или "она замедляет". В ОЛТП замедление не такое большое, не "в разы". А вот в DWH ссылочная целостность может помешать максимально быстрому балк инсёрту, поэтому её часто не используют, но только для тех огромных таблиц, в которые нужно вставлять максимально быстро - и в том случае, если целостность не стоит дополнительных затрат на железо. Т.е., в итоге, ваши рассуждения совершенно правильные, но не правильно обобщать на уровне "Для хранилищ данных -- абсолютно правильная и оправданная инструкция. Тригерры, внешние ключи и прочие констрейнты -- в DWH элементы чужеродные". И так же неправильно правило, которое озвучил ТС: "Нельзя использовать Foreign Key". Очевидная низкая квалификация команды, независимо от того, DWH они делают, или OLTP. ИМХО "старая школа", 30 лет назад это было модно. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2019, 11:41 |
|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
invm А генератор кода кто напишет? А кто будет контролировать правильность генерации? И т.д. и т.п. Если есть критичные места, где нужно гарантировать целостность данных, то таки придется обеспечивать это средствами декларативной целостности. Ибо ничего другое эту целостность не гарантирует. FK в эпоху бигдаты ? вы там на периферии совсем одичали. банки давно мигрировали на бигдата платформы типа хадупа и как бы справляются с гарантиями без "декларативной целостности" (tm) в мсскл2019 запихнули хадуп под задачи аналитики, кто-то в серьез собрался и там колхозить FK ? ЗЫ. в оракле нормальная практика держать отключенными FK, в рсубд FK дают критическую инфу оптимизатору. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2019, 12:07 |
|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
alexeyvg a_voronin Есть способы построить БД так и следовать шаблонам написания кода так, что никакой контроллер не нужен. Я говорю о ХД. В OLTP как правило есть небольшое число таблиц большого размера, где это критично и там надо написать некоторое кол-во кода, который надо хорошо проверить и протестировать и который для ускорения работает без констрейнтов. Одно дело, если вы проводите платежи, другие дело, если вы скидывает информацию в исторический лог, где эти констрейнты никому не нужны. Вообще введение принципа -- ничего не удалять, только метить DELETED = 1 это шаг к тому, чтобы избавиться от внешних ключей. Программисты и администраторы обязательно допускают ошибки, среди поколений менеджеров обязательно найдутся такие, которые будут платить за строки кода, или будут под давлением своих начальников давить на программистов, внедряя костылями важную фичу. Ссылочная целостность не гарантирует отсутствие ошибок вообще, но защищает хотя бы от части ошибок. Безусловно, можно не использовать декларативную ссылочную целостность, но это решение принимается всегда из соображений затраты/профит, а не тупо "она не нужна", или "она замедляет". В ОЛТП замедление не такое большое, не "в разы". А вот в DWH ссылочная целостность может помешать максимально быстрому балк инсёрту, поэтому её часто не используют, но только для тех огромных таблиц, в которые нужно вставлять максимально быстро - и в том случае, если целостность не стоит дополнительных затрат на железо. Т.е., в итоге, ваши рассуждения совершенно правильные, но не правильно обобщать на уровне "Для хранилищ данных -- абсолютно правильная и оправданная инструкция. Тригерры, внешние ключи и прочие констрейнты -- в DWH элементы чужеродные". И так же неправильно правило, которое озвучил ТС: "Нельзя использовать Foreign Key". Очевидная низкая квалификация команды, независимо от того, DWH они делают, или OLTP. ИМХО "старая школа", 30 лет назад это было модно. Прошло уже много времени с тех пор, как я занимался OLTP, но у нас была ситуация, когда на трех реально крупных таблицах мы для скорости убили внешние ключи. И эта была долгая разработка разными людьми на протяжении 8-9 лет. При этом на этом же проекте таблицы платежного модуля были обвешены внешними ключами по максимуму. DEFAULT и UNIQUE констрейнты в ДВХ я сам использовал буквально вот недавно. Триггеры показали себе не с лучшей стороны. Я пробовал их в ДВХ года 4 назад. Лучше использовать OUTPUT и далее в скрипте обновлять по его выхлопу. Но вот внешние ключи на всех хранилищах, которыми я занимался, отсутствовали как класс. Причем далеко не всегда это было моим решением. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2019, 12:12 |
|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
H5N1 FK в эпоху бигдаты ? вы там на периферии совсем одичали. банки давно мигрировали на бигдата платформы типа хадупа и как бы справляются с гарантиями без "декларативной целостности" (tm) в мсскл2019 запихнули хадуп под задачи аналитики, кто-то в серьез собрался и там колхозить FK ? H5N1 в оракле нормальная практика держать отключенными FK, в рсубд FK дают критическую инфу оптимизатору. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2019, 12:35 |
|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
invm a_voronin, А генератор кода кто напишет? Я лично ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2019, 13:21 |
|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
a_voronin Я лично ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2019, 13:34 |
|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
Модератор: Для сравнения СУБД есть отдельный форум. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.12.2019, 15:02 |
|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
H5N1, Вы путаете твердое с тяжелым. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.12.2019, 12:13 |
|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
StarikNavy если мы пишем систему критическую по связанности данным, то нельзя БЕЗ форейн кеев. поэтому лучше сразу учтонять "в случае двх, не рекомендуем использовать форен кеи" Смысл такой, что всю эту внешнюю целостность надо проверять на других уровнях, - когда формируется stage, когда определяется, обрабатывается и передается относительная небольшая дельта в КХД, либо полностью перекладывать на ИС. Вот, к примеру, если изначально ХД основывается на источнике 1С, и там уже построены все внешние ограничения, - зачем делать это еще раз, повторять на уровне DWH? Если у нас не генерятся новые строки, а если и генерятся - то подчинены всем правилам SCD, - то смысл на основном большом массиве данных проверять внешнюю целостность каждый раз? Пусть уровень stage это хотя бы делает - он хоть работает с малым набором данных, и пусть поставляет очищенные и отвалидированные данные в основную, рабочую область ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2019, 09:22 |
|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
a_voronin В общем в двх форейн кей есть зло. и тут плюсадин ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2019, 09:23 |
|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
PsyMisha, Довольно странная точка зрения. Лично я на stage никогда не навешивал функции проверок целостности. У меня обычно все данные уходили в детальный слой, где неконсистентные данные привязывались к "неизвестному элементу". Если такая привязка сохраняется несколько дней/загрузок, то проверочные процедуры в отдельной базе "качества данных" сигнализируют об этом службе поддержки, которая и разбирается, что там такое приехало. Ну и нельзя расчитывать на "изначально ХД основывается на источнике 1С", потому что сначала это 1с, через 3 года это какой-нибудь SAP, а 1с выведена из эксплуатации. А через 5 лет в качестве источников 1С, SAP, Диасофт и Microsoft Dynamics. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2019, 10:56 |
|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
Критик, Ну или так, почему нет - тот же UnknownMember в SSAS Но это - хотя бы логические внешние ключи, как и например в SAP BO - Юниверсы, как и в DAL SSAS - такие же логические сущности. Но главное - не прибитые гвоздями классические FK на уровне БД ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2019, 11:03 |
|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
Критик, Ну или так, почему нет - тот же UnknownMember в SSAS Но это - хотя бы логические внешние ключи, как и например в SAP BO - Юниверсы, как и в DAL SSAS - такие же логические сущности. Но главное - не прибитые гвоздями классические FK на уровне БД ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2019, 11:03 |
|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
Критик А через 5 лет в качестве источников 1С, SAP, Диасофт и Microsoft Dynamics. ну это да, - тут уже суррогатными ключами надо орудовать, чтобы смена ИС внизу не повлияла на уровень выходных витрин для клиентов ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2019, 11:04 |
|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
PsyMisha StarikNavy если мы пишем систему критическую по связанности данным, то нельзя БЕЗ форейн кеев. поэтому лучше сразу учтонять "в случае двх, не рекомендуем использовать форен кеи" Смысл такой, что всю эту внешнюю целостность надо проверять на других уровнях, - когда формируется stage, когда определяется, обрабатывается и передается относительная небольшая дельта в КХД, либо полностью перекладывать на ИС. Вот, к примеру, если изначально ХД основывается на источнике 1С, и там уже построены все внешние ограничения, - зачем делать это еще раз, повторять на уровне DWH? Если у нас не генерятся новые строки, а если и генерятся - то подчинены всем правилам SCD, - то смысл на основном большом массиве данных проверять внешнюю целостность каждый раз? Пусть уровень stage это хотя бы делает - он хоть работает с малым набором данных, и пусть поставляет очищенные и отвалидированные данные в основную, рабочую область Тут нарушение целостности может возникнуть вот откуда. Вы грузите таблицы, связанные в источнике внешним ключом, параллельно, а ещё возможно и по разному расписанию. Например, ваше начальство хочет, чтобы кол-во продаж обновлялось, каждые 10 минут, и вы можете закачивать их с такой скоростью, но при этом вам приходиться сознательно идти на нарушения целостности: вы грузите юзеров, товарный каталог, ответственного за данное направление менеджера, 2-3 раза в сутки, чтобы не мешать этой скоростной загрузке заказов. Тогда вы должны вставлять в эти зависимые справочники заглушки, либо вообще не рассчитывать на то, что найдете зависимую запись. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2019, 14:45 |
|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
a_voronin, Да-да, все верно, такая ситуация может так же возникнуть Я когда-то с таким решением работал: все операционные источники стекались на сервер с инстансом DWH через AlwaysOn - т.е. - их secondary-базы в асинхронном режиме были актуальны с master-репликой, где были писатели/читатели. В момент, когда требовалось прогрузить дельту в КХД - на secondary-базы, которые были в открытом состоянии и аплаили журнал транзакций - приходила команда на создание snapshot'а. И, таким образом, на время обработки инкремента Хранилищем, - оно работало с замороженными на момент до начала операции данными в снепшоте, поэтому там не могла случиться ссылочная нецелостность, когда часть таблиц отработали, а в часть справочников уже залились обновленные/новые строки, и FK мог не отбиться. Ну и весь ETL так же смотрел на снепшот, получается, которые динамикой создавался, дропался и переобновлялся в свою очередь У вас описан так же частный случай этой ситуации, - но обработать-придумать что-либо можно ... |
|||
:
Нравится:
Не нравится:
|
|||
30.12.2019, 17:17 |
|
Ценные указания. Прошу обсудить.
|
|||
---|---|---|---|
#18+
PsyMisha a_voronin, Да-да, все верно, такая ситуация может так же возникнуть Я когда-то с таким решением работал: все операционные источники стекались на сервер с инстансом DWH через AlwaysOn - т.е. - их secondary-базы в асинхронном режиме были актуальны с master-репликой, где были писатели/читатели. В момент, когда требовалось прогрузить дельту в КХД - на secondary-базы, которые были в открытом состоянии и аплаили журнал транзакций - приходила команда на создание snapshot'а. И, таким образом, на время обработки инкремента Хранилищем, - оно работало с замороженными на момент до начала операции данными в снепшоте, поэтому там не могла случиться ссылочная нецелостность, когда часть таблиц отработали, а в часть справочников уже залились обновленные/новые строки, и FK мог не отбиться. Ну и весь ETL так же смотрел на снепшот, получается, которые динамикой создавался, дропался и переобновлялся в свою очередь У вас описан так же частный случай этой ситуации, - но обработать-придумать что-либо можно Все уже давно придумали. Data Vault и Anchor Model грузят все что угодно по любым расписаниям сохраняя целостность там, где она есть и не стопорясь там, где её нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2020, 08:06 |
|
|
start [/forum/topic.php?fid=46&gotonew=1&tid=1686684]: |
0ms |
get settings: |
11ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
38ms |
get topic data: |
13ms |
get first new msg: |
9ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 329ms |
total: | 483ms |
0 / 0 |