【问题标题】:What is a suitable DB structure of my problem?我的问题的合适的数据库结构是什么?
【发布时间】:2011-10-31 17:09:48
【问题描述】:

会有很多不同的产品页面。

产品的数据是从数据库中获取的(id, name, description...) 如果用户喜欢一个产品,他将能够点击一个名为“添加这个”的按钮,然后该按钮将是改为“添加”。

用户可以选择在他的“愿望清单”中添加多个产品。他之前选择的产品将显示为“已添加”。

作为一个初学者,我知道在添加该产品时必须有一种方法可以让user_idproduct_id 连续出现。

至于现在我有products 表。我想我必须创建另一个表来保存user_idproduct_id

感谢您的想法,希望我能理清思路。

【问题讨论】:

    标签: php mysql sql database


    【解决方案1】:

    用户

    id | ...
    

    愿望清单

    id | user_id | ...
    

    Wishlist_Product

    wishlist_id | product_id | ...
    

    产品

    id | ...
    

    这基本上就是您在亚马逊等在线商店中所拥有的。一个User 可以拥有多个Wishlists。一个Wishlist 可以包含多个Products,每个Product 可以包含多个Wishlists


    如果您希望每个 User 只有一个 Wishlist,那么您可以更简单:

    用户

    id | ...
    

    愿望

    user_id | product_id | ...
    

    产品

    id | ...
    

    【讨论】:

      【解决方案2】:

      你在正确的轨道上。您需要一个将用户与他们选择的产品相关联的表格:

      CREATE TABLE selected_products
      (
         choice_id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
         user_id INT NOT NULL,
         product_id INT NOT NULL,
         FOREIGN KEY (user_id) REFERENCES users (user_id),
         FOREIGN KEY (product_id) REFERENCES products (product_id)
      ) ENGINE=InnoDB;
      

      以这种方式检索用户选择:

      SELECT products.product_id, products.description 
      FROM products JOIN selected_products ON products.product_id = selected_products.product_id
      WHERE user_id = '$someuserid';
      

      当用户希望从他的选择中删除产品时,您只需删除一行:

      DELETE FROM selected_products WHERE user_id = '$someuserid' AND product_id = '$product_id';
      

      wishlist 表的功能与selected_products 表完全相同。相同的结构,相同的关系。您还可以考虑添加另一列来指示添加产品时的时间戳:

      date_added TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
      

      【讨论】:

      • 感谢您的完整回答。可以肯定的是,它会对我有所帮助。如有任何问题,我会尽快回复您。
      • 我的数据库必须是 InnoDB 还是 MyISAM
      • @JPampos 好问题。如果你曾经使用过 ON DELETE CASCADE 这样的东西,只有 InnoDB 会正确地强制执行外键关系。使用 InnoDB,这是较新的 MySQL 版本中的默认设置。我在上面加了。
      • @JPampos 没有太多理由再使用 MyISAM,除非您需要在列上进行全文搜索。
      • 由于我的应用程序的“奇怪”形式,添加的产品将是永久性的,并且无法将其删除。因此,任何删除操作都将通过 phpMyAdmin 进行。
      【解决方案3】:

      您应该为此使用参考表。

      确保你的表使用 InnoDB,这样你就可以使用真正的外键

      参考表将主要包含参考表的 KEYS 以及一些相关的元数据。 简单的例子:

      CREATE  TABLE `stackoverflow`.`users` (
      `id` INT NOT NULL AUTO_INCREMENT ,
      `username` VARCHAR(45) NOT NULL ,
      `fname` VARCHAR(45) NOT NULL ,
      `lname` VARCHAR(45) NOT NULL , 
      `cdate` DATETIME NULL ,
      PRIMARY KEY (`id`) )
      ENGINE = InnoDB;
      
      CREATE  TABLE `stackoverflow`.`products` (
      `id` INT NOT NULL AUTO_INCREMENT ,
      `name` VARCHAR(45) NOT NULL ,
      `price` INT NOT NULL ,
      PRIMARY KEY (`id`) )
      ENGINE = InnoDB;
      

      现在是带有真实 FK 的参考表:

      CREATE  TABLE `stackoverflow`.`user_likes_product` (
      `id` INT NOT NULL AUTO_INCREMENT ,
      `id_user` INT NOT NULL ,
      `id_product` INT NOT NULL ,
      `time` DATETIME NOT NULL ,
      PRIMARY KEY (`id`) ,
      INDEX `fk_user` (`id_user` ASC) ,
      INDEX `fk_product` (`id_product` ASC) ,
      CONSTRAINT `fk_user`
      FOREIGN KEY (`id_user` )
      REFERENCES `stackoverflow`.`users` (`id` )
      ON DELETE NO ACTION
      ON UPDATE NO ACTION,
      CONSTRAINT `fk_product`
      FOREIGN KEY (`id_product` )
      REFERENCES `stackoverflow`.`products` (`id` )
      ON DELETE NO ACTION
      ON UPDATE NO ACTION)
      ENGINE = InnoDB;
      

      另一个开始使用 mysql 的建议(如果你在 Windows 上): 下载使用Mysql Workbench

      【讨论】:

        【解决方案4】:

        用户表 - 用户 ID(+ 其他用户信息)

        产品表 - ProdID(+ 其他产品信息)

        UserFavs 表 - UserID、ProdID(+ 其他“喜欢”信息,例如日期、参考链接...)


        我希望还会有其他人-

        UserWishList 表 - UserID、ProdID(+ 其他愿望信息)

        UserOwned 表 - UserID、ProdID(+ 其他拥有的信息)


        这清楚地表明您可以有一个表格将用户与产品相关联并描述这种关系,例如

        UserProduct 表 - UserID、ProdID、Relationship(拥有、希望、喜爱之一)、(+ 其他关系信息)

        用一张桌子来做是一种设计选择,应该基于您的系统的使用方式。如果您的系统是关于关系的,那么一张表将是有意义的。如果您的系统是关于用户的,并且“列表”是单独的,那么单独的表将更有意义。

        【讨论】:

          【解决方案5】:

          1。产品

          id | name | description | ...
          

          2。用户

          id | name | email | ...
          

          3。愿望清单

          id | name | ...
          

          4。 users_wishlists

          user_id | wishlist_id | product_id
          

          【讨论】:

            【解决方案6】:

            我会这样做:

            创建一个名为 user_products 的表 添加(至少)这些列: id(主键) user_id(用户表的外键) product_id(产品表的外键)

            每次喜欢产品时在此表中插入一行。

            【讨论】:

            • 我认为这是一个非常简单的好方法。这会更快,而不是拥有不同的表并加入 them 吗?
            • 我不确定我是否理解您的问题?您已经有了 users 表和 products 表。在这种情况下,加入他们对您没有帮助,因为您需要保存每个用户的选择。因此,您需要第三个表来保持其他两个表之间的关系。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-22
            • 2010-12-26
            • 1970-01-01
            • 1970-01-01
            • 2011-04-12
            相关资源
            最近更新 更多