2014-09-18 2 views
1

N.B. Это не вопрос «Один большой БД или несколько небольших БД».Одна большая база данных MySQL для нескольких клиентов

Использование одной большой базы данных MySQL для нескольких клиентов (такая же структура и т. Д.) С помощью столбца user для разделения клиентов, возможно ли ограничение доступа к таблице для пользователя с соответствующей колонкой user??

Я не слишком хорошо знаком с Microsoft SQL Server, но я кое-что прочитал о «архитектуре данных с несколькими арендаторами», которая, казалось, предлагала это.

Есть ли у MySQL что-то подобное?

+0

Не изначально нет, но вы можете «относительно легко» эмулировать его через разные базы данных на каждого клиента. Такой подход обеспечивает скрытую безопасность и масштабируемость. –

+0

@yshavit Я знаю это, но это не то, о чем я прошу. – Sarke

ответ

1

У MySQL есть привилегии на уровне таблиц и столбцов, но не на уровне ряда привилегий.

Ближайшей задачей будет определение VIEW, через которое пользователь обращается к таблице. У представления есть привилегия доступа к базовой таблице, и у каждого пользователя есть привилегии для доступа к представлению.

Определите представление, чтобы ограничить доступ к текущему пользователю.

mysql> create table base (user varchar(16), x int); 
mysql> insert into base values ('[email protected]', 123), ('[email protected]', 456); 
mysql> create view v as select * from base where user = USER() with check option; 
mysql> select * from v; 
+----------------+------+ 
| user   | x | 
+----------------+------+ 
| [email protected] | 123 | 
+----------------+------+ 
+0

Хороший ответ! Вы ответили на мой вопрос и дали мне хороший обходной путь! – Sarke

+0

Вы имеете в виду «определить VIEW для каждой ** таблицы **» вместо «определить VIEW для каждого ** пользователя **»? Кажется, что один вид 'v' будет работать для всех пользователей. – Sarke

+0

@Sarke, да, хороший звонок. Будет показано одно представление для каждой таблицы. Кроме того, не обязательно верно, что каждый стол нужно обрабатывать таким образом; некоторые таблицы могут быть полностью доступны для всех пользователей. –

1

Я рекомендовал бы против того, 1 большого DB для всех ваших клиентов по нескольким причинам:

  1. я работал в стартапе, где экземпляр AWS для одного из нашей БД просто дарил (без всякой вины наш). Скажем так, это был тяжелый день для всех в офисе. Если это произойдет с вашей ТОЛЬКО БД, как вы собираетесь обеспечить удовлетворенность клиентов? Как вы собираетесь поддерживать надежную систему? Там говорится, что в google сервер идет каждые 2 секунды. Хотя это может не произойти, когда вы начинаете, знайте, что вы не защищены от сбоев в работе ваших серверов. Остановка вашей БД в несколько экземпляров - хороший способ хеджирования против серьезного сбоя.
  2. Если у вас много транзакций, ваш пул потоков всегда будет заблокирован. Вы не хотите этого, потому что это увеличит время, необходимое для выполнения операций CRUD в вашей базе данных, что, в свою очередь, приведет к удовлетворенности клиентов.

Лучший мульт-арендатор archticture вы хотите иметь это:

  1. Есть 1 мастер-DB для каждого клиента (возможно, через каждые 2 клиентов в начале), то есть рабов для каждого мастер-БД у вас есть , Теперь вы можете выполнять все свои записи на ведомых устройствах и выполнять все ваши чтения с мастера. Пока вы держите свои БД в синхронизации, это лучший способ гарантировать, что ваш пул потоков поддерживает доступность и быстро выполняет все транзакции.

Вот отличная статья под названием «High Availability, Load Balancing, and Replication», которая предоставит вам отличную грунтовку для создания надежной многопользовательской системы. Я бы также рекомендовал прочитать статьи на High Scalability

Пожалуйста, дайте мне знать, если у вас есть вопросы!

+0

Интересно, мне нравится, что вы берете «читать мастера, писать рабов». Upvote, но, к сожалению, это не ответ на мой вопрос. – Sarke

Смежные вопросы