【问题标题】:Which database table Schema is more efficient?哪个数据库表Schema更高效?
【发布时间】:2010-09-07 12:24:02
【问题描述】:

哪种数据库表架构更高效,为什么?

"Users (UserID, UserName, CompamyId)"
"Companies (CompamyId, CompanyName)"

"Users (UserID, UserName)"
"Companies (CompamyId, CompanyName)"
"UserCompanies (UserID, CompamyId)"

鉴于用户和公司是一对一的关系。

【问题讨论】:

  • 真的,一对一吗?每个公司只有一个用户,每个用户只属于一个公司?那么你根本不需要公司表,它只是用户的一个属性。反之亦然。

标签: database-design


【解决方案1】:

这是一个开放式问题,取决于您的业务规则。您拥有的第一个选项只允许将一个公司映射到一个用户。您正在定义多对一关系。

第二个架构定义了多对多关系,允许将多个用户映射到多个公司。

它们解决不同的问题,并根据您要解决的问题决定您应该使用什么架构。

严格来说,从“事务”的角度来看,第一个模式会更快,因为您只需提交一行即可将用户对象与公司关联,并检索用户工作的公司只需要一个加入,但是如果您的业务需求发生变化并要求您将多个公司分配给一个用户,则第二种解决方案会更好地扩展。

【讨论】:

    【解决方案2】:

    当然,考虑到这个限制,前一个更有效。为了获得相同的信息,您的查询中的连接数将更少。

    【讨论】:

      【解决方案3】:

      一如既往,视情况而定。我个人会选择第一个答案,因为它的连接更少并且更容易维护。更少的连接应该意味着它需要更少的表和索引扫描。

      SELECT userid, username, companyid, companyname
      FROM companies c, users u
      WHERE userid = companyid
      

      比……好很多

      SELECT userid, username, companyid, companyname
      FROM companies c, users u, usercompanies uc
      WHERE u.userid = uc.userid
      AND c.companyid = uc.companyid
      

      【讨论】:

        【解决方案4】:

        这两种模式无法比较,因为它们有不同的关系,您应该看看表的规范是什么,然后找出适合所需关系的一种。

        第一个意味着用户只能是 one 公司的成员(belongs_to 关系)。而第二种模式意味着用户可以是许多公司的成员(has_many 关系)

        如果您正在寻找可以(或以后)支持 has_many 关系的架构,那么您希望使用第二个。原因比较:

        //选择公司x中具有模式1的所有用户 从公司中选择用户名、公司名 users.companyid = Companies.companyid 上的内部加入用户 其中公司.companyid = __some_id__;

        //选择公司x中具有模式2的所有用户 从公司中选择用户名、公司名 在 usercompanies.companyid = Companies.companyid 上内部加入 usercompanies usercompanies.userid = users.userid 上的内部加入用户 其中公司.companyid = __some_id__;

        您在选择表上有一个额外的联接。如果您只想要belongs_to 关系,那么第二个查询做的工作比它应该做的要多——因此效率会降低。

        【讨论】:

          【解决方案5】:

          我认为当涉及到用户和公司时,您的意思是“多对一”——除非您计划为每个用户建立一个独特的公司。

          要回答您的问题,请使用第一种方法。少一张表来存储会减少空间,并使您的查询使用更少的 JOIN 命令。此外,更重要的是,它正确匹配您所需的输入。数据库模式应该描述所有有效数据的格式——如果它符合格式,它应该被认为是有效的。由于用户只能拥有一家公司,因此如果您使用第二种模式,您的数据库中可能会出现不正确的数据。

          【讨论】:

            【解决方案6】:

            如果 User 和 Company 真的是一对一的关系,那么你只需要一张表:

            (ID, UserName, CompanyName)
            

            但我怀疑您的意思是用户和公司之间存在 一对多 关系 - 一个或多个用户 pr 公司,但只有一个公司 pr 用户。在这种情况下,两表解决方案是正确的。

            如果存在多对多关系(一个公司可以有多个用户,一个用户可以附属于多个公司),那么三表解决方案是正确的。

            请注意,效率并不是真正的问题。数据的性质决定了您应该使用哪种解决方案。

            【讨论】:

              猜你喜欢
              • 2012-04-20
              • 2010-09-11
              • 1970-01-01
              • 2011-06-10
              • 2010-11-10
              • 1970-01-01
              • 2017-11-30
              • 2016-10-18
              • 1970-01-01
              相关资源
              最近更新 更多