什么是我的问题的合适的数据库结构?

时间:2011-08-21 19:20:58

标签: php mysql sql database

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

产品的数据来自数据库(id,名称,描述......)如果用户喜欢某个产品,他就可以点击一个名为“添加”的按钮,然后按钮就会出现改为“添加”。

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

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

至于现在,我有products表。我想我必须创建另一个表格,将user_idproduct_id保存在一起?

感谢您的想法,希望我能清理自己的想法。

6 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

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

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

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


我预计会有其他人 -

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

UserOwned Table - UserID,ProdID(+其他拥有的信息)


这表明您可以拥有一个将用户与产品相关联并描述该关系的表,例如

UserProduct表 - UserID,ProdID,Relationship(拥有,希望,收藏之一),(+其他关系信息)

使用一个表执行此操作是一种设计选择,应根据系统的使用方式进行选择。如果你的系统与关系有关,那么一个表就有意义了。如果您的系统是关于用户的,并且“列表”是单独的,那么单独的表将更有意义。

答案 2 :(得分:2)

我会这样做:

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

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

答案 3 :(得分:2)

1。产品

id | name | description | ...

2。用户

id | name | email | ...

3。愿望清单

id | name | ...

4。 users_wishlists

user_id | wishlist_id | product_id

答案 4 :(得分:2)

您应该使用参考表。

确保您为表使用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

答案 5 :(得分:2)

enter image description here

用户

id | ...

<强>收藏

id | user_id | ...

<强> Wishlist_Product

wishlist_id | product_id | ...

<强>产品

id | ...

这基本上就像亚马逊这样的在线商店。 User可以拥有多个WishlistsWishlist可以包含多个Products,每个Product可以包含多个Wishlists


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

用户

id | ...

<强>希望

user_id | product_id | ...

<强>产品

id | ...