3

如果我有两个或多个域和一个数据库,如何设计数据库和组织数据?所有用于电子商务目的的网站和一种商品都可以在每个网站上出售。所以我只有两个想法:

  1. 我需要在几乎每个表中再创建一个字段(site_id)并重复数据。
  2. 我需要为其他表中的所有其他字段创建一个包含 site_id 信息的表。

这两种想法都有很大的缺点。有任何想法吗?谢谢。

4

5 回答 5

4

这是构建多租户系统时的经典问题。关于这个问题,我听到了一些不同的意见,但它们基本上分为两个阵营:

  1. site_id在包含特定租户数据的每个表上使用租户 ID(在您的情况下)。这种方法的拥护者将轻松识别数据所属的租户作为主要好处,这对数据的归档方式有影响(即不同客户的不同表空间)。

  2. 仅在高级表上使用租户 ID。这种方法的拥护者通常描述了更干净的数据库结构的好处。

我不喜欢为来自不同客户的相同类型的数据创建不同的物理表。这样做有许多不利的后果:

  • 通过 ORM 工具创建一致的对象模型变得困难
  • 这种方法不适用于大量客户——如果您有 70,000 个客户必须从单个数据库获得服务,那么您将拥有 70,000 组表。
  • 必须为 SQL 语句动态生成表名。
于 2009-06-18T21:56:30.507 回答
2

您的架构中的某处可能有少量表链接到您的所有其他表。您需要将 site_id 放入这些表,而不是数据库中的每个表。

对于(一个高度人为的)示例,如果我的架构包括一个客户表、一个发票表和一个发票行项目表,我不需要所有三个表中的 site_id。我只需要客户表中的 site_id。

于 2009-06-18T21:50:48.550 回答
0

我认为 Wordpress 和 Drupal 使用的方法之一是为表添加前缀:

dom1_Customers
dom2_Customers

这样,表格就不会不成比例地增长,并且您不必维护额外的 site_id 索引。也就是说,您的代码必须对其进行补偿,这可能需要进行一些重新设计(并且存储过程基本上没有任何麻烦)。

于 2009-06-18T21:53:20.370 回答
0

我的偏好是在需要的地方创建映射表。认为站点 1、站点 2 等可以存在产品。产品详细信息不会在站点之间更改。产品价格可能会!在这种情况下,价格表可能需要 SiteID 和 ProductID,其中 ProductID 可能会在不同站点上为每个条目复制。用户也可以这样说,只是用户可能会觉得这是“老大哥”的感觉。因此,虽然这可能对客户有用,但我通常建议客户在不同网站上拥有不同的帐户!有时,物理上有效的东西并不意味着它在逻辑上有效。将 SiteID 放在您需要的地方,而不是随意地把它放在任何地方。请记住,您可能在应用程序需要之外的地方需要此 SiteID... 也考虑离线查询。必须执行 5 次连接才能按 SiteID 过滤!维护索引比寻找过滤器要好!

关于通过具有相似名称的单独表的水平分区...使用 SQL Server 2005 及更高版本。它具有分区功能,因此担心数据大小不再是问题。

于 2009-06-18T22:10:51.927 回答
0

多数据库是不可能的吗?它似乎是最简单和最干净的一个,您不可能将一个租户的数据与另一个租户的数据混为一谈。您将需要一个主数据库用于租户信息,每个租户一个数据库。

于 2009-06-21T21:16:14.247 回答