Может ли быть хорошей идеей создать новую таблицу для каждого клиента веб-приложения?

10

Это полус гипотетически, и, поскольку у меня нет опыта работы с массивными таблицами базы данных, я понятия не имею, ужасно ли это по какой-то причине. По ситуации:

Представьте себе веб-приложение, скажем, бухгалтерское программное обеспечение, которое имеет 20 000 клиентов, и каждый клиент имеет более 1000 записей в таблице. Это 20 миллионов строк, которые, я знаю, могут замедлить сложные запросы.

В таком случае имеет ли смысл создавать новую таблицу в базе данных для каждого клиента? Как базы данных реагируют на наличие 20 тыс. (Или более!) Таблиц?

Будет
источник

Ответы:

15

В общем, нет, нет смысла иметь таблицу (я думаю, вы на самом деле имеете в виду базу данных здесь) для каждого клиента. 20 миллионов строк сравнительно мало для таблицы базы данных. Скорость выполнения запросов не должна быть проблемой, если база данных правильно настроена (проиндексирована) и запросы правильно составлены. Какую бы выгоду вы, по вашему мнению, не получили, разделив их, вы компенсируете дополнительную сложность управления 20 000 отдельных баз данных. Например, что происходит, когда вы хотите изменить структуру таблицы? Теперь вы должны сделать это 20000 раз!

В худшем случае, если вы в конечном итоге обнаружите, что размер базы данных становится проблемой, вы всегда можете разделить их на отдельные базы данных впоследствии.

GrandmasterB
источник
нет, я буквально имел в виду таблицы в базе данных. Я не могу представить причину для создания базы данных для каждого клиента. А если 20 миллионов строк мало, что большого? И что ты делаешь в этот момент?
Будет ли
1
@ChrisF, точно - во многих случаях технология или бизнес-модель требуют отдельных БД для каждого клиента. Но я не могу придумать причину для отдельных таблиц в той же БД.
GrandmasterB
1
@GrandmasterB - Я думаю, что @Will задает не тот вопрос.
ChrisF
1
@Will: если возможно, перейдите на собрание Oracle User Group или эквивалентную для какой-либо другой высокопроизводительной базы данных. Вы обнаружите, что ваши идеи о «малом» и «большом» требуют большой корректировки. Это случилось со мной. Подсказка: если он умещается на одном диске, он невелик по стандартам DBA.
Дэвид Торнли
1
@Gorton, InnoDB, как правило, считается лучше для надежности и параллелизма, MyISAM для скорости. Поэтому вам действительно необходимо оценить различные механизмы хранения на основе ожидаемого использования базы данных вашим конкретным приложением.
GrandmasterB
5

Похоже, плохая идея.

Не пытайтесь перехитрить базу данных такими экзотическими конструкциями. Механизмы баз данных разработаны с множеством оптимизаций для обработки больших наборов данных. Например, то, что вы описываете, звучит ужасно близко к попытке вручную реализовать индексы. Просто используйте индексы, предоставляемые DB Engine, они реализованы намного лучше, чем вы, вероятно, сможете сделать самостоятельно, и это не потребует такого большого количества обслуживания.

Кроме того, как общее правило. Я предлагаю не создавать базу данных таким способом, который требует манипулирования или создания структур базы данных (таблиц, полей) во время обычного использования приложения. Это делает оптимизацию для производительности медленным и часто вынуждает вас давать слишком много разрешений пользователям для выполнения рутинных задач, потенциально создающих дыры в безопасности.

JohnFx
источник
Я бы проголосовал один раз за каждый из двух ваших абзацев, если позволил.
Дэвид Торнли
3

Вот статья, которую я всегда призываю людей читать, когда они задают этот вопрос:

http://datacharmer.blogspot.com/2009/03/normalization-and-smoking.html

MCHL
источник
Я понятия не имел, что БД создает фактический файл для каждой таблицы = x
Will
1
Это может зависеть от фактической используемой СУБД. MySQL делает это (до трех файлов на таблицу, если вы используете MyISAM). Другие не могут.
Mchl
Корпоративная версия SQL Server сделает это, если вы создадите ее таким образом, но не автоматически.
JeffO
Oracle определенно не делает этого.
user281377 28.12.10
Oracle может сделать это, так же, как SQL Server может сделать это, но я не могу понять , почему вы когда - либо спроектировать схему , чтобы иметь один файл для каждой таблицы. Разделение базы данных на несколько файлов имеет смысл, но не один файл на таблицу.
Дин Хардинг
1

ИМХО, единственная таблица не должна быть проблемой, поэтому не создавайте проблему там, где ее нет - пока. Вы можете многое сделать для повышения производительности. Вы можете разделить одну таблицу на несколько файлов на основе clientID или поля даты, чтобы помочь с IO. Ваша БД не должна отслеживать, оптимизировать и кэшировать 20 000 различных SQL-операторов для каждого запроса, который понадобится вашему сайту. Вы можете индексировать по клиенту. Клиенты 20K могут заплатить за большое количество оборудования.

Для этого типа таблицы можно использовать NoSQL типа db.

С 20K-клиентами база данных может быть не самым слабым звеном, так зачем вводить такую ​​сложность?

JeffO
источник
`Вы можете разделить одну таблицу на несколько файлов на основе clientID или поля даты, чтобы помочь с вводом-выводом. Не знаю, что вы подразумеваете под этим. Любое уточнение?
Будет ли
Несколько файлов в операционной системе. Сервер может выполнять больше операций чтения / записи для многих файлов, а не только для одного.
Джефф
Я думаю, я имел в виду: я никогда не слышал о такой вещи, где я могу найти больше информации о том, как это сделать? :-) Но я попаду в Google ~
Уилл
msdn.microsoft.com/en-us/library/ms345146(v=sql.90).aspx Вы можете столкнуться с проблемами производительности резервного копирования, если индексы находятся в отдельных файлах, а не в таблицах, которые они индексируют (или, возможно, на дисках?).
JeffO
0

Это действительно плохой подход.

Разделение таблицы по вертикали, 2 сервера баз данных, один для нечетных идентификаторов пользователей, а другой для четных, должны работать хорошо (данные не связаны между пользователями).

Сортируйте данные по user_id и, если это невозможно, получите огромное количество RAM или SSD дисков.

Slawek
источник