Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database design 如何为多个域设计数据库?_Database Design_Multi Tenant - Fatal编程技术网

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

Database design 如何为多个域设计数据库?,database-design,multi-tenant,Database Design,Multi Tenant,如果我有两个或多个域和一个数据库,如何设计数据库和组织数据?所有用于电子商务目的的网站和一个商品可以在每个网站上出售。所以我只有两个想法: 我需要在几乎每个表和重复数据中再创建一个字段(site_id) 我需要为其他表中的所有其他字段创建一个包含站点id信息的表 这两种想法都有很大的缺点。有什么想法吗?谢谢。您的模式中可能有一小部分表链接到所有其他表。您需要将站点id放在这些表中,而不是数据库中的每个表中 对于(一个精心设计的)示例,如果我的模式包括一个Customers表、一个Invoices

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

  • 我需要在几乎每个表和重复数据中再创建一个字段(site_id)
  • 我需要为其他表中的所有其他字段创建一个包含站点id信息的表

  • 这两种想法都有很大的缺点。有什么想法吗?谢谢。

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


    对于(一个精心设计的)示例,如果我的模式包括一个Customers表、一个Invoices表和一个Invoices Line Items表,那么我不需要在所有三个表中都使用site_id。我只需要客户表中的站点id。

    我认为Wordpress和Drupal使用的方法之一是在表前面加上名称:

    dom1_Customers
    dom2_Customers
    

    通过这种方式,表不会按比例增长,您也不必维护站点id的额外索引。也就是说,您的代码必须对其进行补偿,这可能需要一些重新实现(并且存储过程基本上没有任何问题)。

    在构建多租户系统时,这是一个典型的问题。我在这件事上听到了一些不同的意见,但基本上分为两大阵营:

  • 在包含特定租户数据的每个表上使用租户id(
    site\u id
    )。这种方法的倡导者认为,易于识别数据所属的租户是一个主要的好处,并对数据的归档方式产生了影响(即为不同的客户提供不同的表空间)

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

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

    • 通过ORM工具创建连贯的对象模型变得很困难
    • 这种方法不能很好地扩展到大量客户——如果您有70000个客户必须从一个数据库获得服务,那么您将有70000组表
    • 必须为SQL语句动态生成表名

    我的首选是在需要的地方创建映射表。认为一个产品可以存在于站点1、站点2等。产品的详细信息不会因站点而改变。但产品价格可能会更高!在这种情况下,Prices表可能需要SiteID和ProductID,其中ProductID可以跨不同站点为每个条目复制。用户也可以这么说,只是用户可能会觉得这是“老大哥”。因此,虽然这可能适用于客户,但我通常建议客户在不同的网站上拥有不同的帐户!有时,物理上可行的并不意味着逻辑上可行。把SiteID放在你需要它的地方,而不是随便把它放在任何地方。请记住,在应用程序需要该站点ID的地方,您可能需要该站点ID……也可以考虑脱机查询。必须做5个连接才能按站点ID进行过滤,这太糟糕了!维护索引比搜索过滤器要好


    关于通过具有相似名称的单独表进行水平分区,请使用SQLServer2005和更高版本。它具有分区功能,因此不再担心数据大小。

    多数据库是不可能的吗?这似乎是最简单和最干净的一个,您不可能将一个tennants数据与另一个的数据混淆。。
    租户信息需要一个主数据库,每个tennant需要一个db。

    假设客户不在站点之间共享。这样的决定以后通常会非常后悔,尤其是在数据库中实现了N+个其他站点之后。您可能有多少个站点?1, 10, 1000, 10000? 基于此,人们的答案会有所不同。