2013-05-01 2 views
0

Моя команда и я строим продукт SaaS, который будет использоваться несколькими компаниями по всему миру. Проще говоря, наше программное обеспечение делает некоторые базовые учетные записи для них и предупреждает их, если какой-либо документ должен быть обновлен.Как создать эффективные базы данных для многопользовательского SaaS-продукта?

Проблема заключается в том, что для каждой такой компании в Индии может быть только 3 таких документа, но 4 в Шри-Ланке и 7 в Сингапуре. И каждое поле может быть названо по-разному. Например, три поля могут быть названы «Водительские права», «Страхование», «Разрешение» в Индии, но их можно назвать «XYZ», «XXYZ» и «XZY» в Сингапуре.

Каков наилучший и эффективный способ реализации таких функций с помощью MySQL. Допустим, я могу ограничить количество таких столбцов в 5. Кроме того, я не хочу использовать NoSQL для этого проекта.

Мы используем PHP, работающий на CodeIgniter, и мы планируем развернуть его на Engineyard.

ответ

0
CREATE TABLE Countries (
    CountryCode CHAR(2) PRIMARY KEY, 
    CountryName VARCHAR(255), 
); 

CREATE TABLE Companies (
    CompanyID SERIAL, 
    CountryCode CHAR(2) REFERENCES Countries (CountryCode), 
    -- etc. 
); 

CREATE TABLE Documents (
    CountryCode CHAR(2) REFERENCES Countries (CountryCode), 
    DocumentID INT UNSIGNED, 
    DocumentName VARCHAR(255), 
    -- etc. 
    PRIMARY KEY (CountryCode, DocumentID) 
); 

CREATE TABLE CompanyDocuments (
    CompanyID BIGINT UNSIGNED REFERENCES Companies (DocumentID), 
    CountryCode CHAR(2)   REFERENCES Countries (CountryCode), 
    DocumentID INT UNSIGNED, 
    Expiry  DATE, 
    PRIMARY KEY (CompanyID, DocumentID), 
    FOREIGN KEY (CountryCode, DocumentID) REFERENCES 
    Documents (CountryCode, DocumentID) 
); 
2

Существует 2 подхода к многозначной системе единого БД. На этом сайте показано очень хорошее объяснение.

http://msdn.microsoft.com/en-us/library/aa479086.aspx

Общая схема или отдельная схема.

Но, кроме того, как решить проблему с несколькими теннантами, кажется, ваш вопрос также касается «того, как хранить разные типы документов для разных компаний на основе их страны», и этот вопрос не тесно связан с многозначимостью. Это более общая проблема в дизайне реляционных БД. Но вот подход, который вы могли бы использовать:

Country -- basic country list 
\ id 
\ name 

Company -- basic information about company 
\ id 
\ name 
\ countryid 

DocumentType -- Diffrent types of documents stored 
\ id 
\ name 

DocumentTypeCountry -- this linked allowed (or mandatory, as you want to define it) document types to a country 
\ id 
\ documenttypeid 
\ countryid 

Document -- the document itself 
\ id 
\ companyid 
\ documenttypeid 
\ moredocumentfields 
+0

Спасибо за помощь. почему мне не приходилось изолировать документы в отдельный стол?!? Было бы легко сделать многое. – Manikandan

+0

У меня есть еще один вопрос. У каждого из моих клиентов есть уникальная формула для расчета тарифа (это таксисты). формулы не могут быть обобщены, но имеют одинаковые входные и выходные переменные. но формулы зависят от клиента. Поскольку это продукт SaaS, я хочу, чтобы все было автоматизировано. Я думал о том, чтобы позволить им написать свою собственную формулу на PHP и использовать eval для ее работы, но это кажется глупым. Есть ли способ создать «конструктор формул» в PHP? – Manikandan

+0

Это немного зависит от типа формулы, очень сложная математика трудно поместить в какой-то конструктор формул. Но для операторов такси это, скорее всего, всегда будет в нескольких возможных форматах. Я думаю, вы должны иметь возможность обобщить формулу, в которой будут работать только некоторые переменные. Например, одна компания использует цену за пассажира за километр, а другую на километр, тогда вы можете сделать что-то вроде этого: startfee ​​+ (kmfee * km) + (пассажирские пассажиры) + (пассажирское поле * пассажир * км). Если вы установите переменные платы в 0, вы получите эту часть. – nvanesch