如何为多个域名设计数据库?

3

如果我有两个或更多域名和一个数据库,如何设计数据库并组织数据?所有网站都是为电子商务目的而设立的,每个网站都可以销售一种商品。因此,我只有两个想法:

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

这两个想法都有很大的缺陷。有什么好的想法吗?谢谢。


你可能会有多少个网站?1个、10个、1000个还是10000个?人们的答案会因此而异。 - WW.
5个回答

4
这是在构建多租户系统时的一个经典问题。关于这个问题,我听到了几种不同的意见,但它们基本上可以分为两派:
1. 在每个包含特定租户数据的表中使用租户ID(在您的情况下是“site_id”)。支持此方法的人认为,识别数据所属的租户的便利性是主要优点,对于数据如何归档也有影响(即为不同客户使用不同的表空间)。
2. 仅在高级别表中使用租户ID。支持该方法的人通常描述其好处是数据库结构更加清晰。
我不喜欢为来自不同客户的相同类型数据创建不同的物理表。这会带来一些不利后果:
- 通过ORM工具创建一个连贯的对象模型变得困难。 - 这种方法在处理大量客户时无法很好地扩展--如果您必须从单个数据库服务于70,000个客户,则将拥有70,000个表集合。 - 必须动态生成SQL语句的表名。

2

很可能在您的模式中有一小部分表格链接到所有其他表格。您需要将site_id放入这些表格中,而不是数据库中的每个表格。

举个(高度虚构的)例子,如果我的模式包括客户表、发票表和发票行项目表,我不需要在这三个表格中都有site_id。我只需要在客户表格中有一个site_id即可。


假设客户不在站点之间共享。 - J. Polfer

0

我认为WordPress和Drupal使用的方法之一是给表格加上前缀:

dom1_Customers
dom2_Customers

这样表格就不会失控,也不需要维护额外的site_id索引。话虽如此,您的代码必须进行相应的补偿,这可能需要一些重新调整(如果没有某些恶意存储过程的话)。


3
这样的决定通常会在以后懊悔不已,特别是在将其他N个站点添加到您的数据库之后。 - molf

0
我的偏好是在需要时创建映射表。想象一下,一个产品可以存在于网站1、网站2等等。产品的详细信息在不同的网站上并不会改变。但是价格可能会有所不同!这种情况下,价格表可能需要SiteID和ProductID,其中ProductID可能会在不同网站的每个条目中复制。对于用户来说也可能是这样,只不过用户可能会感到这是“大兄弟”的感觉。因此,虽然这对客户可能有效,但我通常建议客户在不同的网站上拥有不同的账户!有时候,物理上可行的并不意味着逻辑上也可行。将SiteID放在需要它的地方,而不是随意地放在任何地方。请记住,您可能需要在应用程序之外的地方使用这个SiteID……也要考虑离线查询。必须进行5次连接才能按SiteID筛选数据将很糟糕!维护索引比寻找筛选器更好!
关于通过具有类似名称的单独表进行水平分区......使用SQL Server 2005及以上版本。它具有分区功能,因此不再需要担心数据大小的问题。

0

多数据库是否不可行?它似乎是最简单和最干净的方法,您不可能混淆一个租户的数据与另一个租户的数据。您需要一个主数据库来存储租户信息,以及每个租户一个数据库。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接