【问题标题】:Would this be a ideal way to setup a database?这是设置数据库的理想方式吗?
【发布时间】:2019-05-09 22:40:52
【问题描述】:

还没有完成一些关系,对此有些困惑。

follows 是否会是多对一关系,因为客户可以关注许多商家但商家不能关注客户?

【问题讨论】:

  • 一个客户可以关注多个商户,一个商户可以关注多个客户,这是多对多的关系。但是user_id 应该是customer_id(并引用customerid)在您的follows 表中。
  • 明白了,有道理。像这样? imgur.com/puZhHWF 我还假设我应该将 user_id 变成 customer_id 用于 likesorders 表。

标签: database postgresql database-design


【解决方案1】:

我认为这将是多对多,因为多个客户可以关注商家,每个商家都与多个客户相关。要规范化此关系,您将创建一个新表 - 将其命名为 customer_merchants 或类似名称。这只有两列,一个customer_id 和一个merchant_id。

每次有客户关注商家时,您都会在 customer_merchant 中创建一个新行来反映这一事实。

现在,customers 和 customer_merchants 之间存在 1-many 关系,merchant 和 customer_merchants 之间存在 1-many 关系。

这是一个关于数据库规范化的网页,可以帮助您了解更多信息:-

https://www.w3schools.in/dbms/database-normalization/

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    这是一种经典的“多次通过”关系。

    • 客户有很多关注
    • 客户通过关注有很多商家
    • 商家有很多关注
    • 商家通过关注有很多客户

    因为关系是不同模型之间的(即一个客户不能关注另一个客户),所以您不必构造多态表;将“关注”作为连接就足够了。

    【讨论】:

      【解决方案3】:

      我怀疑我可能还没有完全理解你所有设计的含义,所以我尽我所能将这个设计做成第五范式。

      我认为客户、用户和商家都是扮演角色的人。 例如,语义线索之一是“性别”是人的属性,而不是称为“用户”的事物的属性。 (“用户”是一个人所扮演的角色)

      另一个好的做法是将所有地址数据存储在一个表中。 每个角色(客户、用户和商家)都通过使用“Person”表的 PK-FK 关系链接到地址表。

      我假设一种产品可以有许多变体,这就是变体有自己的表格的原因。

      SQL DDL 基于 T-SQL(抱歉,我不会说 PostGres,但 this wiki 应该能帮上忙)

      所以这里有两个人工制品:第五范式的逻辑模型和该逻辑模型的 SQL DDL。

      SQL DDL

          CREATE SCHEMA Orders
      GO
      
      CREATE TABLE Orders.Person
      (
          personNr int NOT NULL,
          addressNr int NOT NULL,
          firstName nchar(30) NOT NULL,
          gender nchar(6) NOT NULL,
          lastName nchar(30) NOT NULL,
          CONSTRAINT Person_PK PRIMARY KEY(personNr)
      )
      GO
      
      
      CREATE TABLE Orders.Address
      (
          addressNr int NOT NULL,
          city nchar(50) NOT NULL,
          countryCode nchar(2) NOT NULL,
          postalCode nchar(12) NOT NULL,
          street nchar(50) NOT NULL,
          CONSTRAINT Address_PK PRIMARY KEY(addressNr)
      )
      GO
      
      
      CREATE TABLE Orders.Customer
      (
          customerNr int NOT NULL,
          orderNr int NOT NULL,
          stripeID nchar(30) NOT NULL,
          CONSTRAINT Customer_PK PRIMARY KEY(customerNr)
      )
      GO
      
      
      CREATE TABLE Orders.Merchant
      (
          merchantNr int NOT NULL,
          creationDate datetime NOT NULL,
          merchantName nchar(30) NOT NULL,
          CONSTRAINT Merchant_PK PRIMARY KEY(merchantNr)
      )
      GO
      
      
      CREATE TABLE Orders."User"
      (
          userNr int NOT NULL,
          email nchar(50) NOT NULL,
          password nchar(50) NOT NULL,
          userName nchar(20) NOT NULL,
          CONSTRAINT User_PK PRIMARY KEY(userNr)
      )
      GO
      
      
      CREATE TABLE Orders."Order"
      (
          orderNr int NOT NULL,
          orderDate datetime NOT NULL,
          orderStatus nchar(10) NOT NULL,
          CONSTRAINT Order_PK PRIMARY KEY(orderNr)
      )
      GO
      
      
      CREATE TABLE Orders.Product
      (
          productNr int NOT NULL,
          createdDate datetime NOT NULL,
          productName nchar(40) NOT NULL,
          productStatus nchar(10) NOT NULL,
          unitPrice decimal(6,2) NOT NULL,
          CONSTRAINT Product_PK PRIMARY KEY(productNr)
      )
      GO
      
      
      CREATE TABLE Orders.OrderHasProductInQuantity
      (
          orderNr int NOT NULL,
          productNr int NOT NULL,
          quantity smallint NOT NULL,
          CONSTRAINT OrderHasProductInQuantity_PK PRIMARY KEY(orderNr, productNr, quantity)
      )
      GO
      
      
      CREATE TABLE Orders.Variant
      (
          variantNr int NOT NULL,
          imageURL nchar(200) NOT NULL,
          title nchar(20) NOT NULL,
          variantPrice decimal(6,2) NOT NULL,
          CONSTRAINT Variant_PK PRIMARY KEY(variantNr)
      )
      GO
      
      
      CREATE TABLE Orders.PersonLikesProduct
      (
          personNr int NOT NULL,
          productNr int NOT NULL,
          CONSTRAINT PersonLikesProduct_PK PRIMARY KEY(personNr, productNr)
      )
      GO
      
      
      CREATE TABLE Orders.PersonFollowsMerchant
      (
          merchantNr int NOT NULL,
          personNr int NOT NULL,
          CONSTRAINT PersonFollowsMerchant_PK PRIMARY KEY(personNr, merchantNr)
      )
      GO
      
      
      ALTER TABLE Orders.Person ADD CONSTRAINT Person_FK FOREIGN KEY (addressNr) REFERENCES Orders.Address (addressNr) ON DELETE NO ACTION ON UPDATE NO ACTION
      GO
      
      
      ALTER TABLE Orders.Customer ADD CONSTRAINT Customer_FK1 FOREIGN KEY (orderNr) REFERENCES Orders."Order" (orderNr) ON DELETE NO ACTION ON UPDATE NO ACTION
      GO
      
      
      ALTER TABLE Orders.Customer ADD CONSTRAINT Customer_FK2 FOREIGN KEY (customerNr) REFERENCES Orders.Person (personNr) ON DELETE NO ACTION ON UPDATE NO ACTION
      GO
      
      
      ALTER TABLE Orders.Merchant ADD CONSTRAINT Merchant_FK FOREIGN KEY (merchantNr) REFERENCES Orders.Person (personNr) ON DELETE NO ACTION ON UPDATE NO ACTION
      GO
      
      
      ALTER TABLE Orders."User" ADD CONSTRAINT User_FK FOREIGN KEY (userNr) REFERENCES Orders.Person (personNr) ON DELETE NO ACTION ON UPDATE NO ACTION
      GO
      
      
      ALTER TABLE Orders.OrderHasProductInQuantity ADD CONSTRAINT OrderHasProductInQuantity_FK1 FOREIGN KEY (orderNr) REFERENCES Orders."Order" (orderNr) ON DELETE NO ACTION ON UPDATE NO ACTION
      GO
      
      
      ALTER TABLE Orders.OrderHasProductInQuantity ADD CONSTRAINT OrderHasProductInQuantity_FK2 FOREIGN KEY (productNr) REFERENCES Orders.Product (productNr) ON DELETE NO ACTION ON UPDATE NO ACTION
      GO
      
      
      ALTER TABLE Orders.Variant ADD CONSTRAINT Variant_FK FOREIGN KEY (variantNr) REFERENCES Orders.Product (productNr) ON DELETE NO ACTION ON UPDATE NO ACTION
      GO
      
      
      ALTER TABLE Orders.PersonLikesProduct ADD CONSTRAINT PersonLikesProduct_FK1 FOREIGN KEY (personNr) REFERENCES Orders.Person (personNr) ON DELETE NO ACTION ON UPDATE NO ACTION
      GO
      
      
      ALTER TABLE Orders.PersonLikesProduct ADD CONSTRAINT PersonLikesProduct_FK2 FOREIGN KEY (productNr) REFERENCES Orders.Product (productNr) ON DELETE NO ACTION ON UPDATE NO ACTION
      GO
      
      
      ALTER TABLE Orders.PersonFollowsMerchant ADD CONSTRAINT PersonFollowsMerchant_FK1 FOREIGN KEY (personNr) REFERENCES Orders.Person (personNr) ON DELETE NO ACTION ON UPDATE NO ACTION
      GO
      
      
      ALTER TABLE Orders.PersonFollowsMerchant ADD CONSTRAINT PersonFollowsMerchant_FK2 FOREIGN KEY (merchantNr) REFERENCES Orders.Merchant (merchantNr) ON DELETE NO ACTION ON UPDATE NO ACTION
      GO
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-26
        • 1970-01-01
        • 2021-02-23
        • 2011-01-22
        • 1970-01-01
        • 1970-01-01
        • 2019-08-12
        • 1970-01-01
        相关资源
        最近更新 更多