如果我有两个或多个域和一个数据库,如何设计数据库和组织数据?所有用于电子商务目的的网站和一个商品都可以在每个网站上出售。所以我只有两个想法:
这两种想法都有很大的缺陷。有任何想法吗?感谢。
答案 0 :(得分:4)
这是构建多租户系统时的典型问题。我在这个问题上听到了一些不同的意见,但它们基本上分为两个阵营:
在包含特定租户数据的每个表上使用租户ID(在您的情况下为site_id
)。这种方法的倡导者认为,轻松识别数据所属的租户是一个主要的好处,对数据的存档方式有影响(即不同客户的不同表空间)。
仅在高级表上使用租户ID。这种方法的倡导者通常将这些好处描述为更清洁的数据库结构。
我不喜欢为来自不同客户的相同类型的数据创建不同的物理表。这会带来许多不利后果:
答案 1 :(得分:2)
可能在您的架构中的某些地方有一小部分表链接到所有其他表。您需要将这些表放入site_id,而不是数据库中的每个表。
对于(一个非常人为的)示例,如果我的架构包括Customers表,Invoices表和Invoice Line Items表,我在所有三个表中都不需要site_id。我只需要客户表中的site_id。
答案 2 :(得分:0)
我认为Wordpress和Drupal使用的方法之一是使用名称为表添加前缀:
dom1_Customers
dom2_Customers
这样,表格不会成比例增长,您不必维护site_id的额外索引。也就是说,您的代码必须对其进行补偿,这可能需要一些重新检测(并且存储过程基本上没有一些肮脏)。
答案 3 :(得分:0)
我的偏好是在需要时创建映射表。认为产品可以存在于站点1,站点2等。产品详细信息不会在站点之间发生变化。虽然产品价格可能!在这种情况下,Price表可能需要SiteID和ProductID,其中可以为不同站点的每个条目复制ProductID。除了用户可能会觉得这是“大哥哥”之外,用户也可以这样说。因此,尽管这可能对客户有效,但我通常建议客户在不同的网站上拥有不同的帐户!有时候,身体上的工作并不意味着它在逻辑上会起作用。将SiteID放在您需要它的地方,而不是偶然地把它放在任何地方。请记住,您可能需要在应用程序需要之外的地方使用此SiteID ...请考虑离线查询。必须通过SiteID进行5次连接才能过滤掉!维护索引比不得不寻找过滤器更好!
关于通过具有相似名称的单独表进行水平分区...使用SQL Server 2005及更高版本。它具有分区功能,因此担心数据大小不再是问题。
答案 4 :(得分:0)
多数据库是不可能的?它似乎是最简单,最干净的一个,你不可能把一个Tennants数据与另一个数据混乱。 您需要一个Master数据库用于租户信息,每个Tennant需要一个db。