Как использовать запросы MySQL для разделения данных, готовясь к веб-приложению с несколькими арендаторами / белыми метками?

Я создал рабочее веб-приложение, использующее AngularJS поверх API отдыха (Slim / PHP / MySQL) для своей собственной компании. Теперь у меня есть куча запросов, чтобы пометить его для других компаний, таких как моя.

Мой бэкэнд, вероятно, имеет около сотни конечных точек API Rest, встроенных в PHP, которые извлекаются из MySQL.

Какой самый простой / лучший способ для меня выделить эти данные?

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

Затем добавьте это в каждую команду SQL:

...AND entityID=X
ie.
SELECT * FROM invoices WHERE status='paid' AND entityID=1;

Это кажется очень грубым способом сделать это, потому что мне нужно было бы отредактировать более 100 команд SQL, некоторые из которых являются сложными объединениями. Можете ли вы придумать лучший способ? Мне было интересно, есть ли какой-нибудь способ использовать «MySQL Views». Я уже использую представления, чтобы скрыть «удаленные строки»:

CREATE VIEW invoices AS
SELECT * FROM _invoices where deleted is null;

Так что теоретически я должен иметь возможность просто редактировать все мои взгляды … верно?

CREATE VIEW invoices AS
SELECT * FROM _invoices where deleted is null
AND entityID=@entityID;
// BUT HOW would i set that entityID as a sql Variable from each PHP call?...
//  I suppose I would have to add this before each call?
SET @entity=X;

Можете ли вы придумать другой способ, или помочь мне реализовать эту переменную в виде, или указать мне правильное направление?

-3

Решение

Это метод, с которым я пошел:

  • Я вел основную базу данных со всеми данными всех лиц / компаний, имея entityID колонка.
  • Я создал новые базы данных для каждой сущности, но эта база данных заполнена представлениями MySQL, которые ссылаются на основную базу данных. Например:

.

 # ie. main database has tables: users, and invoices tables
# if you i have a new company named "acme", then:
create database acme;
create view acme.users as select * from maindb.users where entityID=2;
create view acme.invoices as select * from maindb.invoices where entityID=2;

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

Но хранение фактических данных в одной базе данных упрощает обслуживание.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]