Я знаю, что Shopify использует только одну базу данных для всех магазинов. Но как они могут обрабатывать свою базу данных с такими большими данными? Это хорошая идея использовать одну базу данных для более 50 000 магазинов?
Я знаю, что Shopify использует только одну базу данных для всех магазинов. Но как они могут обрабатывать свою базу данных с такими большими данными? Это хорошая идея использовать одну базу данных для более 50 000 магазинов?
Ответы:
Обратите внимание: я отвечаю с точки зрения SQL Server, поэтому я упоминаю некоторые концепции, специфичные для SQL Server, но я полагаю, что все эти концепции имеют эквиваленты в других основных платформах RDBMS с аналогичными преимуществами и ограничениями.
Я также, вероятно, продолжу редактировать этот ответ, поскольку я думаю о других потенциальных плюсах / минусах.
Ну, это действительно зависит от схемы, объема и т. Д. Что именно хранит магазин? Чем он отличается от хранения данных о 50000 кошек, 50000 продуктов или 50000 орехов?
Есть несколько причин (помимо одного лишь аспекта размера), почему вы можете не захотеть хранить данные для 50000 различных клиентов в одной базе данных, если действительно данные могут быть полностью разделены по клиентам (не включая таблицы поиска, такие как почтовые индексы или таблицы для конкретного приложения, которые могут быть помещены в единую центральную базу данных):
если один клиент перерастает приложение, нет простого способа извлечь только свои данные и перенести их на другой экземпляр, сервер и т. д. для масштабирования, если вы не планируете заранее и не разбиваете на что-то вроде CustomerID
и не имеете 50 000 файловых групп (вы ограничены в любом случае, до 15 000 разделов или до 1000, если вы используете более старую версию SQL Server и слишком много файловых групп может иметь катастрофические последствия ). Также обратите внимание, что для разделения требуется Enterprise Edition.
если окажется, что все ваши клиенты просто слишком велики для этого экземпляра, масштабирование означает получение нового оборудования и перемещение всей базы данных туда (и, возможно, повторение этого в будущем).
Удаление клиента может быть столь же болезненным, так как вам придется удалить несколько% строк из очень больших таблиц, и это будет недешево.
вы, вероятно, будете иметь широкое распространение данных о клиентах (один клиент с миллиардом строк, другой клиент с 5000). Это может привести к таким вещам, как сниффинг параметров и отрицательная производительность, включая количество элементов и качество плана (поскольку вы, вероятно, будете повторно использовать одни и те же планы для одних и тех же запросов в отношении очень разных наборов данных).
на всех ваших клиентов распространяются одинаковые SLA и планы HA / DR. Либо у вас есть вся база данных в режиме полного восстановления с n-минутным резервным копированием журнала, либо вы работаете в простом режиме и полагаетесь на полное + разностное резервное копирование. Если вам нужно вернуться из-за ошибки клиента или вам необходимо восстановить базу данных на определенный момент времени, это влияет на каждого отдельного клиента.
Существует вероятность ошибок при извлечении данных - ошибки, например, в случаях, когда предложения могут привести к тому, что один клиент увидит данные другого клиента или все данные других клиентов.
это может иметь юридические последствия (некоторые компании будут предъявлять строгие требования о том, чтобы вы не размещали их данные в той же базе данных, что и любая другая компания, и особенно их конкурентов).
если важна безопасность данных какого-либо одного клиента, то достичь этого гораздо проще, используя разделение базы данных, чем разделение внутри таблицы.
Некоторые преимущества наличия каждого клиента в отдельной базе данных (или, по крайней мере, наличие нескольких баз данных, каждая для группы клиентов):
DROP DATABASE
.Некоторые недостатки: