具有过期时间的产品的MySQL表设计

时间:2015-08-03 19:05:28

标签: php mysql sql

我有一家商店,我销售的产品有持续时间(用户的到期时间)。 我有一个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

在此先感谢,感谢任何帮助。

2 个答案:

答案 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)