我有一家商店,我销售的产品有持续时间(用户的到期时间)。 我有一个mysql表用于看起来像这样的用户
| user_id | user_name | user_password | user_email |
和另一个产品:
| product_id | product_name | product_price |
我正在销售两种产品,所以现在我想知道是否应该在用户表中添加两列,以便它看起来像这样。
| user_id | user_name | user_password | user_email | product_one | product_two |
并在这些字段中为已购买产品的用户提供过期日期(默认情况下两者都为空),
或者我应该为购买的产品制作一个新表格,然后存储相应的user_id
。
在此先感谢,感谢任何帮助。
答案 0 :(得分:3)
第二种选择更像是3NF(第3范式)。我在电子商店(主要是Opencart)方面有一点经验,而且在我看来,无论我已经看过什么,这都是他们的工作方式。
事实上,再多一个表可以保存'Orders'和'User_Id',另一个表可以保存'Orders'和'Product_Ids'。“/ p>
我既不是数据库也不是电子商店平台专家,但根据我的经验,我会选择第二个。
修改强>
我正在编辑我当前的答案以添加示例。因此,您已经有两个表,一个用于用户(客户),另一个用于产品。这两个表是(如前所述)以下(我不知道实际的表名,所以我会把我的。)
表'用户':
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int money = 30;
int x = 15;
char input;
int japp = 5;
int daim = 7;
int cocacola = 10;
int fanta = 10;
cout << " Welcome to my candy machine" << endl;
cout << " choose one of the following items" << endl;
cout << endl;
cout << endl;
while (x != 22)
{
if (money <= 0)
{
cout << endl;
cout << "Your have no money left!! therefore you cant shop anymore " << endl;
cout << endl;
cout << endl;
money = 0;
}
cout << "Slott 1 JAPP " << japp << " 10 kronor" << endl;
cout << "Slott 2 Daim " << daim <<" 10 kronor"<< endl;
cout << "Slott 3 coca cola " << cocacola <<" 15 kronor "<< endl;
cout << "Slott 4 Fanta " << fanta <<" 15 kronor"<< endl;
cout << endl;
cout << endl;
cout << " you have " << money << " kronor left" << endl;
cout << endl;
cout << endl;
cout << "abort [A]" << endl;
cin >> input;
switch (input)
{
case '1':
if (japp <= 5)
{
cout << endl;
cout << endl;
japp--;
money -= 10;
}
if (japp <= 0)
{
cout << " there is no moore japp!!" << endl;
cout << endl;
japp = 0;
}
if (money <= -1)
{
japp++;
}
break;
case '2':
if (daim <= 7)
{
daim--;
money -= 10;
}
if (daim <= 0)
{
cout << " there is no more daim !!" << endl;
cout << endl;
daim = 0;
}
if (money <= -1)
{
daim++;
}
break;
case'3':
if (cocacola <= 10)
{
cocacola--;
money -= 15;
}
if (cocacola <= 0)
{
cout << "there is no more coke !!" << endl;
cout << endl;
cocacola = 0;
}
if (money <= -1)
{
cocacola++;
}
break;
case '4':
if (fanta <= 10)
{
fanta--;
money -= 15;
}
if (fanta <= 0)
{
cout << " there is no moore fanta !!" << endl;
cout << endl;
fanta = 0;
}
if (money <= -1)
{
fanta++;
}
break;
case 'A':
cout << " ending the game...." << endl;
return 0;
case 'a':
cout << " ending the game.... " << endl;
return 0;
default:
cout << " wrong option, pleas choose between option 1 - 4 " << endl;
cout << endl;
cout << endl;
break;
}
}
return 0;
}
表'产品':
| user_id | user_name | user_password | user_email |
所以,我的建议是引入一个新实体(让我们命名该实体'order')并创建一个表格,其中包含与制作它的用户匹配的每个订单。所以'orders'表将是这样的:
| product_id | product_name | product_price |
然后您将拥有另一个表,该表将使用product_id匹配每个订单。在此表中,您还可以拥有“到期时间”字段。此类表格的示例如下:
表'order_products':
| order_id | user_id |
然而,最后一个表有一个缺陷:它没有PRIMARY KEY。您必须在这里有点创意,并导入一个字段以保存主键,例如| order_id | product_id | product_exp_date |
,它将为每个单独的订单中的每个单独产品保留唯一标识符。但你必须找到一种方法来解决这个问题。
希望这澄清了我的想法。
答案 1 :(得分:1)
你想要一个单独的表,我将其命名为users_products。这将允许您添加产品。它通常更灵活。
它将包含这些列
user_id
product_id
expiration
您可以找到用户拥有的当前产品:
select u.user_name, u.user_email, p.product_name
from users u
left join users_products up on u.user_id = p.user_id
left join products p on up.product_id = p.product_id
and p.expiration >= NOW()
users_products表的主键应该是由所有三列组成的复合键。
当您向ID为123的用户销售ID为321的产品,在30天后到期时,您可以使用此查询在数据库中表示该产品。
INSERT INTO users_products
(user_id, product_id, expiration)
VALUES ( 123, 321, NOW() + INTERVAL 30 DAY)