我即将潜入SAAS项目,我已经组建了一个小团队来制作。在大多数情况下,我们已经准备好了所有功能,但我现在需要开始考虑数据库架构和安全问题。
是否存在与普通Web应用程序项目不同的安全问题,因为您可能有数百名用户?
就数据库而言,我一整天都在阅读关于数据库设计的帖子,我想我会用一个数据库来处理所有内容,但我想知道这是否会变慢?假设您有一个“客户”表,其中包含30,000条记录。对于每个客户而言,这不会比为数据库做db更慢吗?
此外,注册和MY客户信息是否与实际SAAS应用程序位于同一数据库中。换句话说,来到我的网站并注册免费试用的用户是否应该进入一个数据库,而他的所有团队和客户等都进入实际的产品数据库,或者它应该只是一个数据库?
在深入研究之前还需要考虑其他因素吗?我将在Codeigniter框架上构建它。
答案 0 :(得分:4)
以下是一些想法:
安全强>
你会从拥有更大用户群的潜在黑客那里得到更多的关注,但在很大程度上你的安全问题应该大致相同(只是因为有人发现并利用安全漏洞的机会和后果)要高得多。)
我不知道您对Codeigniter了解多少,但它内置了许多安全功能。还有一些您想要的任何网站的安全保护。
<强>性能强>
我没有任何硬冷数字给你这里,但绝对看看确保所有适当的字段都被索引,因为表扫描可能会变得非常慢,行数更多。
避免数据过度正常化 - 有时在多个地方存储相同的数据会更好。然后,您会在更新数据时遇到性能损失,但在读取数据时可能会节省连接时间。
如果有机会使用数据库触发器,请选择它 - 它比让您的Web应用程序向数据库发送多个查询以完成同样的事情要快得多。
如果您将免费试用帐户隔离到另一个数据库,它将有助于保持“真实客户数据”与试用数据分开(并且更容易说,只对非试验数据进行perofrm自动备份)。从基础设施的角度来看,如果您希望将免费试用和常规服务转移到单独的系统上,它也会更容易。
尽管没有太多数据库,但请记住,每次推送更新时,您都需要确保每个数据库架构都是最新且快乐的。如果您有数百个客户端数据库,那么对它们进行任何类型的非自动化管理都可能很容易变成一场噩梦。
答案 1 :(得分:0)
将单个数据库用于SaaS应用程序时需要考虑的一件大事:
此外,在决定为试用帐户和付费帐户设置单独的数据库之前,请考虑当试用帐户转换为付费帐户时会发生什么。他们肯定希望保留所有数据。您是否要将所有数据从试用数据库移至付费数据库?
答案 2 :(得分:0)
根据我使用SaaS的经验,最好将数据保存在每个访问的同一数据库中。如果您使用的是MySQL,那么每个数据库在任何时候都可以打开多少个表是有限制的。如果您使用大量具有大量表的数据库,则会遇到内存和I / O问题。我记得有一个项目,我们每个客户端有1个数据库,我们在10个客户端(每个30~40个表)之后在4GB服务器上达到内存限制。
像威廉说的那样,如果可能的话,你要避免过度规范化。您可能希望尽可能为对象属性实现EAV表,例如在每个客户端可能每个站点具有不同配置的用户表上。对于用户角色,用户组等也是如此。如果您正在构建电子商务功能,那么您肯定希望使用EAV。对于普通网站,3NF可以;大多数重复数据被分离出来并与外键链接在一起,因此您没有20-30列的表。对于SaaS应用程序,您可能需要将其升级到4NF的BCNF,以便您可以提供额外的应用程序灵活性。网站/应用确定
显示所用网址的正确网站至关重要。最简单的形式是使用XML / JSON文件,并在请求时扫描XML文件以匹配URL。尽可能将其缓存在内存中,因为您会发现每个新站点的流量都会线性上升。如果您有3个网站,那么一个应用程序的流量将是其3倍,而不是分布在三个不同的应用程序中。
安全强>
这取决于您需要的安全级别。如果您需要SSL证书,如果您要从同一IP托管所有站点,则可以购买共享服务器证书。如果每个站点都需要自己的SSL,那么您将不得不适应站点的不同IP。那时你需要映射URL =&gt;的IP。
基于用户的安全性与显示正确的网站一样重要。您需要确保检测到基于注入的攻击。您可以利用内置的CI功能,但为了安全起见,您应该进行自己的过滤。检查整数是否真的是整数。您可以向CI添加其他库以实现此目的。 ACL在SaaS应用程序中非常重要非常,因为您希望限制谁看到了什么,并且限制每个人访问自己网站的内容。它很容易概念化,但很难实现,应该被认为是正确的第一个开发任务。设计ACL,测试设计,开发测试用例,如果有效,则实现它。
<强>性能:强>
CI非常适合性能,轻量级而没有太多的内存占用。您将希望尽可能地利用缓存 - 数据库,文件,APC,Memcache等。请记住,数据库缓存总是比文件缓存更快,但它会为数据库服务器创建更多的socket / tcp请求。如果数据库服务器存在瓶颈,则会影响站点性能。
在性能方面我会推荐一件事,看一下使用几个不同的Web服务器并在你将要运行的硬件上加载测试。很好的选择是Apache,Nginx&amp;的Litespeed。我用过Apache&amp; Nginx之前;它们在某些情况下都表现良好,如果你适当地调整它们将能够毫不费力地处理大量的流量。请记住,Nginx配置与Apache不同,因此htaccess规则必须以Nginx格式编写并保存到站点配置中。您还将使用php-fpm而不是suexec。如果您确实使用Apache,请确保将htaccess规则保存到站点配置文件,而不是使用根目录中的.htaccess文件。原因是文件统计信息会创建I / O请求,并且许多I / O请求最终会造成瓶颈。
100%尽可能使用应用程序级缓存,只需确保提前计划关键索引,以便为每个客户端站点获取正确缓存的信息。一种好方法是散列网站名称,甚至将url用作密钥索引的一部分(例如www_joeblogs_com_somekeyasdasd)。我知道有些CMS应用程序没有这样做(Joomla)所以你将从其他网站返回数据!