|
|
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
Простой пример, есть головная организация, есть филиалы. Софт и там и там одинаковый, структура БД тоже. Есть задача организовать слив всех БД филиалов в БД головной конторы. Какое решение лучше применить? 1. Добавить еще один ключ абсолютно во все таблицы БД, который будет "ID филиала" 2. Создавать отдельную БД на каждую контору, в софте сделать возможность выбора с какой БД работать 3. Одна БД, но разный префикс таблиц, например так же по ID филила Какие еще решения возможны? Какое предпочтительней? Кол-во филиалов может быть до 100 и более. Таблиц в одной БД ~100 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2011, 23:46 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
Sokoloid Какие еще решения возможны?Решений вагон и маленькая тележка Sokoloid Какое предпочтительней?Зависит от ваших критериев предпочтительности Sokoloid Какое решение лучше применить?Лобовой совет от балды - держите бакапы баз в центре, собирайте логи от баз с филиалов и применяйте их на кучу бакапов, а затем делайте с ними что хотите. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2011, 02:43 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
SokoloidКакое предпочтительней? Следующая задача после "слива" будет - считать всякого рода отчёты по общим данным, потом править некоторые данные в центре и рассылать изменения в филиалы. Поэтому предпочтительнее решения, подразумевающие нахождение в одной таблице данных всех филиалов. Это облегчит также все операции апгрейда структуры и всю сложную бизнес-логику, которая наверняка появится - не завтра так послезавтра. Исключением из этого может быть случай использования СУБД, плохо работающей с суммарным объёмом данных в одной таблице. Тянуть всюду ID филиала - дурная и тупая работа. После того как Вы всюду его сунете и поправите все запросы на его использование, заказчик захочет возможность сослаться из "московской" строчки на "ростовскую" - например, принять в Москве платёжку от заказчика, филиал которого купил что-то в вашем ростовском отделении. Вы посмотрите на структуру и обнаружите, что если таблица ссылается на 5 других, в ней нужно иметь 6 разных полей "ID филиала", сунув каждое в свой внешний ключ и ещё раз очень-очень аккуратно переписав запросы... Поэтому с моей точки зрения однозначно, метод генерации ID записей должен обеспечивать уникальность в пределах организации. Я предпочитаю вариант create sequence ID start with <номер филиала> increment by 1000. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2011, 07:50 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
Sokoloid, Для начала посмотреть в возможности софта. В том же 1С это делается на уровне софта а не БД. А вообще если хотите получить ответ - научитесь задавать вопрос. Это к тому что неуказан ни софт, ни БД, ни размер таблиц БД и самой БД, ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2011, 10:24 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
SokoloidКакие еще решения возможны? Слить все в одну базу, обеспечив уникалность ИД, и правильно раздать права доступа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2011, 11:25 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
Софт вебовый, база MySQL. Ну допустим обеспечиваю я уникальность ID в любой таблице, НО мне нужно четко знать чьи данные я смотрю. Т.е. например переключаю контекст на филиал №1 и у меня отображаются данные только по нему, переключаю на №2 и смотрю только по нему. Такой вариант мне слабо видится только при уникальном ID или сводится опять к тому же - править все запросы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2011, 13:19 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
Sokoloid, Как вариант преобразовать ID: 10002345 в B0102345, а в фильтре по филиалу смотреть where left(id,3)='B01' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2011, 13:29 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
Sokoloid, Весь вопрос - потенет ли мускул такой объем с необходимым вам качеством... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2011, 13:30 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
Злой БобрSokoloid, Как вариант преобразовать ID: 10002345 в B0102345, а в фильтре по филиалу смотреть where left(id,3)='B01' Чем тогда это отличается от варианта 1 который я описал в начале, т.е. обязательность уникальности ID не требуется, а добавляется еще одно поле ID-филиала (ваше B01) и делается составной первичный ключ ID + ID-филиала? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2011, 13:34 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
Злой БобрSokoloid, Весь вопрос - потенет ли мускул такой объем с необходимым вам качеством... Это как раз не пугает, т.к. partitioning еще никто не отменил, работал с хорошей скорость на >2млд записях. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2011, 13:35 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
тут еще вопрос по данным... есть данные - общие для всех филиалов например Контрагенты, Города, ПланСчетов итд тупо слить их в одну кучу просто добавив ид или префикс не получится, вернее получится, но получится свалка данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2011, 14:52 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
Chopтут еще вопрос по данным... есть данные - общие для всех филиалов например Контрагенты, Города, ПланСчетов итд тупо слить их в одну кучу просто добавив ид или префикс не получится, вернее получится, но получится свалка данных Да, как раз и получится свалка данных, возможно даже дублирующихся, но в контексте конкретного филиала это будут уникальные данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.02.2011, 21:00 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
SokoloidДа, как раз и получится свалка данных, возможно даже дублирующихся, но в контексте конкретного филиала это будут уникальные данные.а смысл тогда сливать в одну БД? поставь их рядом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2011, 07:00 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
SokoloidЧем тогда это отличается от варианта 1 который я описал в начале, т.е. обязательность уникальности ID не требуется, а добавляется еще одно поле ID-филиала (ваше B01) и делается составной первичный ключ ID + ID-филиала? Тем что ненужно менять структуру базы. Единственное проследить за правильностью формирования новых id на филиалах. Но с другой стороны на большом объеме фильтр по отдельному полю будет работать гораздо быстрее. Поэтому тут нужно выбрать между скоростью и изменением структуры базы. Если нужно сделать быстро, то мой вариант, если есть время - переделывать структуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2011, 11:17 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
Есть еще вариант для конкретного филиала определить границы id, тогда это тоже непотребует изменения структуры и будет работать быстро про фильтровании. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2011, 11:18 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
Вопрос дублей решается таблицей соответствия в общей базе. Можно частично автоматизировать по ОКПО, ИНН, Наименованию, ... В общем это решаемый вопрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2011, 11:21 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
Злой БобрНо с другой стороны на большом объеме фильтр по отдельному полю будет работать гораздо быстрее. Сомневаюсь, что в реальных случаях будет хоть какая-то разница. В запросах наподобие select /*+ first_rows(100) */ * from request where server_id = :server_id and status = 'open' order by request_date фильтрация по серверу будет последней операцией. Злой БобрЕсть еще вариант для конкретного филиала определить границы id, тогда это тоже непотребует изменения структуры и будет работать быстро про фильтровании. Ага, работал я в конторе с таким вариантом. К моменту моего прихода они уже накатали код, который циклил id и искал дырки в нумерации. В результате среди прочего принципиально не работали операторы insert select. Ну а потом таки появилась табличка, в которой надо было держать куда больше данных, чем отвели id-шников, и наступил локальный коллайдер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2011, 11:37 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
softwarer, Можешь несомневаться. При большой выборке отбор по индексированному отдельному полю работает быстрее. Проверялось на MSSQL. Это проблема людей которые ступили. При грамотном подходе такого непроисходит даже в теории. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2011, 11:43 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
Злой БобрМожешь несомневаться. При большой выборке отбор по индексированному отдельному полю работает быстрее. Проверялось на MSSQL. Ты что с чем сравнивал, уважаемый проверяющий? :) Злой БобрЭто проблема людей которые ступили. При грамотном подходе такого непроисходит даже в теории. Ага, ага. Можно вкратце грамотную теорию? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2011, 11:54 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
softwarerТы что с чем сравнивал, уважаемый проверяющий? :) Поскольку уважаемый Бобр занят важными делами, позволю себе краткую иллюстрацию. Сделано на Oracle, но принципы одинаковы для любой СУБД. Создадим условия для проверки. Таблица с данными по разным "филиалам", один большой - Москва, остальные маленькие. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. Посмотрим, как будет выполняться обычный запрос какой-нибудь списочной формы, "документы по этому серверу в порядке по дате". Чтобы максимизировать шансы server_id, без других фильтров. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. Вот незадача - сервер почему-то не хочет использовать "отдельное поле server_id", ему пофиг, что по нему быстро фильтруется. Почему же это? Заставим его таки использовать индекс: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. Ну вот и ответ, почему. Потому что с точки зрения сервера так будет в 50 раз дольше. Проверим ещё для немосковского филиала: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. Ну да, конечно, никакой разницы. Ладно, предположим, что мы криво собрали статистику, и сервер не любит server_id из-за этого. Попробуем учесть перекос в данных: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. Отлично, есть гистограммы по server_id, вот теперь-то он точно будет использоваться! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. Дальнейшие пояснения требуются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2011, 12:38 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
SokoloidСофт вебовый, база MySQL. Ну допустим обеспечиваю я уникальность ID в любой таблице, НО мне нужно четко знать чьи данные я смотрю. Т.е. например переключаю контекст на филиал №1 и у меня отображаются данные только по нему, переключаю на №2 и смотрю только по нему. Раздать права доступа. Подключился от филиал №1 и видишь только свое и общее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.02.2011, 14:50 |
|
||
|
Проектирование БД. Сливание многих БД в одну.
|
|||
|---|---|---|---|
|
#18+
softwarer, тут теоретики ещё варианты могут предложить: 1. создать индекс по двум полям (сервер, дата) 2. использовать другой сервер СУБД, который эффективнее умеет индексы по разным полям между собой "скрещивать", прежде чем в данные лезть :) ... Но я не теоретик, поэтому не согласен с "Сделано на Oracle, но принципы одинаковы для любой СУБД"... ТС, может для MySQL и правильный напрашивающийся вывод "будет ещё хуже чем, на Оракл" - но стоит проверять такие предположения... Тем более softwarer любезно выложил почти готовые скрипты для проверки предположения на MySQL... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2011, 19:08 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=37119721&tid=1542308]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
177ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 519ms |

| 0 / 0 |
