如何为多租户SaaS产品设计有效的数据库?

时间:2013-05-01 07:01:26

标签: php mysql codeigniter saas engineyard

我和我的团队正在构建一个SaaS产品,供世界各地的多家企业使用。简而言之,我们的软件对它们进行了一些基本的计算,并在某些文件需要更新时提醒它们。

问题是,印度每家公司可能只有3份此类文件,但斯里兰卡有4家,新加坡有7家。每个字段的名称可能不同。例如,这三个字段在印度可能被称为“驾驶执照”,“保险”,“许可”,但在新加坡可能被称为“XYZ”,“XXYZ”和“XZY”。

使用MySQL实现此类功能的最佳和最有效的方法是什么。假设我可以将这些列的数量限制为5.另外,我不想在这个项目中使用NoSQL。

我们正在使用在CodeIgniter上运行的PHP,我们计划在Engineyard上部署。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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)
);