需要帮助为SaaS应用程序设计数据库模式

时间:2016-08-02 03:14:33

标签: mysql sql-server database database-design

我是开发人员,之前从未使用过DB(设计数据库)。我正在为员工管理系统设计一个数据库,这是一个使用MySQL作为其数据库的Node.js + Express应用程序。

我已经有了必需的表格,列已经整理出来,但我仍然处理很少的未知数。到目前为止,这是我的计划,我需要你的意见。

  1. 使用此应用程序的最终用户将是中小型公司。这些公司不会在数据库中共享表格。因此,如果有一个名为EmployeeCases的表,我计划为每个现有公司或注册此应用程序的新公司创建一个新的EmployeeCases表。我计划将该表命名为EmployeeCases_989809890,其中" 989809890"将是公司ID(或客户ID)。因此,如果我们有3-4家公司为我们注册,那么所有表(至少是公司使用的表)都将被重新创建并命名为TableName_CompanyId。我的问题,这是一个好方法吗?有更好的方法吗?

  2. 所有员工的数据都由Employee表保存,包括他们的登录名和密码。现在,DB中的每个Employee表都将被命名为Employee_CompanyId(根据我上面的计划)。我的问题是,当员工登录时,我如何知道要查询的Employee表?或者我应该从Employee表中删除登录并创建一个通用Users表,其中将存储所有员工? Users表也将CompanyId作为其列之一,我将从那里读取CompanyId,用于查询其他表。

  3. 此类设计的任何参考,网站或博客将不胜感激。

    感谢。

2 个答案:

答案 0 :(得分:2)

我不推荐这种方法,我认为你应该:

A)将所有信息放在同一个表中,并使用companyId列对其进行排序

B)为每个公司分别拥有数据库,并使用相应的数据库代码。

问题是,如果您使用不同名称的同一个表的多个副本,那么通过您的方法,您将很难维护您的应用程序。例如,如果您决定将列添加到其中一个表中,则必须编写与表实例一样多的SQL脚本。您的所有唯一标识符也会很糟糕。

以下是每种设计的优点/缺点:

A)将所有信息放在同一个表格中并使用compagnyId列对其进行排序

优点:

  • 最简单
  • 允许使用外键/约束
  • 非常适合跨/客户端数据提取

缺点:

  • 不可携带(客户不能随身携带他/她的数据)
  • 可以被认为不那么安全(我想你可以两种方式做到这一点)
  • 更有可能拥有庞大的牌桌
  • 不能很好地扩展

B)为每家公司建立单独的数据库,并使用相应的数据库。

优点:

  • 便携式
  • 可以被视为更安全

缺点:

  • 需要更多纪律来跟踪所有数据库
  • 需要很好地隔离HUB(您的应用程序跟踪哪个客户端访问哪个数据库)以及您客户的数据库中的一部分。
  • 您需要一个公司的登录页面(或让您的客户在一个字段中指定公司)

使用此“两步登录”的应用程序示例为Slack,当您登录时,首先输入您的团队域,然后输入您的用户凭据。

我认为Google Apps for Work是同样的方法。此外,我认为我使用的大多数CRM都为其客户提供了一个单独的数据库。

最后,我想引导您转到一个有趣的例子this other question on stackoverflow

答案 1 :(得分:0)

你不应该因为公司不能分享他们的信息而拆分你的桌子。相反,您应该在每个表中都有一个companyId列,并且可以访问每个查询的相关数据。这应该在你的后端实现