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

Php 如何为多租户SaaS产品设计有效的数据库?,php,mysql,codeigniter,saas,engineyard,Php,Mysql,Codeigniter,Saas,Engineyard,我和我的团队正在构建一个SaaS产品,该产品将被世界各地的多家企业使用。简单地说,我们的软件会对它们进行一些基本的核算,并在某些文档到期需要更新时向它们发出警报 问题是,在印度,每家这样的公司可能只有3份这样的文件,但在斯里兰卡有4份,在新加坡有7份。每个字段的名称可能不同。例如,这三个字段在印度可能被称为“驾照”、“保险”、“许可证”,但在新加坡可能被称为“XYZ”、“XXYZ”和“XZY” 使用MySQL实现这些特性的最佳和最有效的方法是什么。假设我可以将此类列的数量限制为5。另外,我不想在

我和我的团队正在构建一个SaaS产品,该产品将被世界各地的多家企业使用。简单地说,我们的软件会对它们进行一些基本的核算,并在某些文档到期需要更新时向它们发出警报

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

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

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

创建表(
CountryCode字符(2)主键,
CountryName VARCHAR(255),
);
创建表格公司(
公司ID序列号,
CountryCode字符(2)引用国家(CountryCode),
--等等。
);
创建表文档(
CountryCode字符(2)引用国家(CountryCode),
DocumentID INT未签名,
DocumentName VARCHAR(255),
--等等。
主键(国家代码、文档ID)
);
创建表CompanyDocuments(
CompanyID BIGINT未签名引用公司(DocumentID),
CountryCode字符(2)引用国家(CountryCode),
DocumentID INT未签名,
到期日,
主键(公司ID、文档ID),
外键(国家代码、文档ID)引用
文档(国家代码、文档ID)
);

多天线、单DB系统有两种方法。这个网站提供了一些很好的解释

共享模式或分离模式

但除了如何解决多坦能问题外,您的问题似乎也是关于“如何根据国家/地区为不同的公司存储不同的文档类型”,这个问题与多坦能没有密切关系。这是关系数据库设计中比较普遍的问题。但这里有一种方法你可以使用:

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

谢谢你的帮助。为什么我没有想到要将文档隔离到一个单独的表中?!?会让很多事情变得容易。我还有一个问题。我的每个客户都有一个独特的公式来计算收费(他们是出租车运营商)。这些公式不能推广,但具有相同数量的输入和输出变量。但是公式是特定于客户的,因为这是一个SaaS产品,所以我希望一切都是自动化的。我曾想过允许他们用PHP编写自己的公式,并使用eval来计算,但这似乎很愚蠢。有没有办法在PHP中创建一个“公式生成器”呢?这取决于公式的类型,非常复杂的数学很难放入某种类型的公式生成器中。但对于出租车运营商来说,它很可能总是以几种可能的形式出现。我认为你应该能够推广一个公式,它只需要一些变量就可以工作。例如,一家公司使用每乘客每公里的价格,另一家公司使用每公里的价格,然后您可以这样做:startfee+(kmfeekm)+(passengerfeepassengers)+(passengerkmfeepassengerkm)。如果将费用变量设置为0,则将该部分取出。