Database design 基于1对多方法的数据库设计

Database design 基于1对多方法的数据库设计,database-design,Database Design,我正在学习数据库设计,给出以下业务需求。我应该采用哪种设计方法 每个客户都可以应用许多应用程序 每个公司都可以应用许多应用程序 每个组织可以应用多种应用程序 我想到的每一种方法都有一个退步。如果你要选择正确的设计 A) 方法1 应用 应用程序\u PK 申请日期 应用程序详细信息 客户主键 公司主键 组织机构 B) 方法2 应用 应用程序\u PK 申请日期 应用程序详细信息 应用程序客户 应用程序\u PK 客户主键 应用程序公司 应用程序\u PK 客户主键 应用组织 应用程序\u PK 一

我正在学习数据库设计,给出以下业务需求。我应该采用哪种设计方法

  • 每个客户都可以应用许多应用程序
  • 每个公司都可以应用许多应用程序
  • 每个组织可以应用多种应用程序
  • 我想到的每一种方法都有一个退步。如果你要选择正确的设计

    A) 方法1

    应用 应用程序\u PK
    申请日期
    应用程序详细信息
    客户主键
    公司主键
    组织机构

    B) 方法2

    应用 应用程序\u PK
    申请日期
    应用程序详细信息

    应用程序客户 应用程序\u PK
    客户主键

    应用程序公司 应用程序\u PK
    客户主键

    应用组织 应用程序\u PK

    一对多关系中的外键通常位于“多”表中,指向“一”表。因此,它应该是“方法2”

    你不会说什么是反向关系。一个应用程序是否可以由多个客户拥有?不止一个组织?如果是,这些是“多对多”关系。在这种情况下,您必须在这两者之间添加一个联接表:

    CUSTOMER -------- CUSTOMER_APPLICATION ------------ APPLICATION
    (CUSTOMER_ID)     (CUSTOMER_ID, APPLICATION_ID)     (APPLICATION_ID)
    

    一对多关系中的外键通常位于“多”表中,指向“一”表。因此,它应该是“方法2”

    你不会说什么是反向关系。一个应用程序是否可以由多个客户拥有?不止一个组织?如果是,这些是“多对多”关系。在这种情况下,您必须在这两者之间添加一个联接表:

    CUSTOMER -------- CUSTOMER_APPLICATION ------------ APPLICATION
    (CUSTOMER_ID)     (CUSTOMER_ID, APPLICATION_ID)     (APPLICATION_ID)
    

    编辑:

    -- All users of the application with ApplicationID = 7
    select
          a.ApplicationID
        , u.UserId
        , u.UserType
    from User_Application  as x
    join Application       as a on a.ApplicationID = x.ApplicationID
    join User              as u on u.UserId        = x.UserID
    left join Customer     as c on c.UserID        = u.UserID
    left join Company      as m on m.UserID        = u.UserID
    left join Organization as r on r.UserID        = u.UserID
    where  a.ApplicationID = 7 ;
    

    编辑:

    -- All users of the application with ApplicationID = 7
    select
          a.ApplicationID
        , u.UserId
        , u.UserType
    from User_Application  as x
    join Application       as a on a.ApplicationID = x.ApplicationID
    join User              as u on u.UserId        = x.UserID
    left join Customer     as c on c.UserID        = u.UserID
    left join Company      as m on m.UserID        = u.UserID
    left join Organization as r on r.UserID        = u.UserID
    where  a.ApplicationID = 7 ;
    

    规范隐含地说您有一个多对多关系(CMIIW)。使用这种“桥牌桌”很好

    嗯,选择正确的设计很容易。第二种方法是正确的。但选择哪种设计更好更难。这取决于您的另一个“隐式”规格。表演


    我想,你的第一个方法是“不太正常”。我(再次)猜测它将比“更正常”的第二种方法执行得更快。但是,除非证明第二种方法的速度明显较慢,否则不应使用这种方法。

    规范隐含地说,您具有多对多关系(CMIIW)。使用这种“桥牌桌”很好

    嗯,选择正确的设计很容易。第二种方法是正确的。但选择哪种设计更好更难。这取决于您的另一个“隐式”规格。表演


    我想,你的第一个方法是“不太正常”。我(再次)猜测它将比“更正常”的第二种方法执行得更快。但是,除非证明第二种方法的速度明显较慢,否则不应使用这种方法。

    使用“方法1”,给定的应用程序只能与一个客户、一个公司和/或一个组织关联。您好,我想知道,使用方法2,我需要将3表ApplicationCustomer、ApplicationOrganization、,ApplicationCompany检索与客户/组织/公司相关的详细信息。使用“方法1”,给定的应用程序最多只能与一个客户、一个公司和/或一个组织关联。您好,我想知道使用方法2,我需要联合3表ApplicationCustomer、ApplicationOrganization、,Application Company检索与客户/组织/公司相关的详细信息。可能是输入错误。在第二种方法中,applicationCompany表应该包含Company_PK。一个公司和一个组织(当然是在用例方面)有什么区别?嗨,patrick,即。。。公司和组织有不同的细节可能是打字错误。在第二种方法中,applicationCompany表应该包含Company_PK。一个公司和一个组织(当然是在用例方面)有什么区别?嗨,patrick,即。。。公司和组织有不同的细节Shi damir,你的方法看起来很好,但有一个问题。如果检索应用程序,如何确定该应用程序属于组织、客户或公司?如果添加标志列,即ApplicationType=Com、Org、Cust。我可以去掉usertype表吗?@liangteh——你是说
    User
    表?我会说不,在我看来,
    应用程序
    用户
    是两个不同的实体,我不会把它们混在一起。嗨,达米尔,你的方法看起来很不错,但有一个问题。如果检索应用程序,如何确定该应用程序属于组织、客户或公司?如果添加标志列,即ApplicationType=Com、Org、Cust。我可以去掉usertype表吗?@liangteh——你是说
    User
    表?在我看来,
    应用程序
    用户
    是两个不同的实体,我不会把它们混为一谈。