存储客户产品的最佳方法

时间:2015-06-20 18:42:14

标签: php mysql

好吧,我在这里有两种方法来存储我的客户购买的产品。但我想知道我应该使用哪一个,所以我在这里得到一些意见 第一种方法是:

try
{
    $connection = new PDO("mysql:host={$HOST};dbname={$DB_NAME}", $USERNAME, $PASS);
}

$connection->beginTransaction();
$sql = "INSERT INTO orders (customer_id, customer_name, order_value, order_date)
        VALUES (?, ?, ?, ?)";

$query = $connection->prepare($sql);
$query->execute(array
(
    $user_id,
    $user['user_name'],
    $order_value,
    $date
));

$id_of_respective_order = $connection->lastInsertId();

$sql = "INSERT INTO purchased_products (order_id, product_name, product_price, quantity)
        VALUES (?, ?, ?, ?)";

$query = $connection->prepare($sql);

foreach($_SESSION['cart'] as $product)
{
    $query->execute(array
    (
        $id_of_respective_order,
        $product['product_name'],
        $product['product_price'],
        $product['quantity']
    ));
}

$connection->commit();

现在让我们解释一下:使用上面的方法,我将订单插入一个表中,将购买的产品插入另一个表中,然后我可以使用{{1显示任何客户在HTML表中购买的每个产品}} Foreign Key我在order_id表格中。{
现在我有第二种方法:

purchased_products

使用此方法,我只能使用表格键try { $connection = new PDO("mysql:host={$HOST};dbname={$DB_NAME}", $USERNAME, $PASS); } $connection->beginTransaction(); $sql = "INSERT INTO orders (customer_id, customer_name, order_value, order_date, purchased_products) VALUES (?, ?, ?, ?, ?)"; $purchased_products = null; foreach($_SESSION['cart'] as $product) { $purchased_products .= " <table> <tr> <th>Product Name</th> <th>Product Price</th> <th>Quantity purchased</th> </tr> <tr> <td>{$product['product_name']}</td> <td>{$product['product_price']}</td> <td>{$product['quantity']}</td> </tr> </table> "; } $query = $connection->prepare($sql); $query->execute(array ( $user_id, $user['user_name'], $order_value, $date, $purchased_products )); $connection->commit(); 在表格中显示产品。 什么方法最好?如果我使用第一个,我可以使用该值进行操作但是......我一直在研究并了解到插入是一个瓶颈。购买ID自动分配,然后我使用lastInsertionId确定哪些产品属于上次购买。但这意味着,如果两个人同时购买会有错误吗?人们将不得不等待操作完成,因为瓶颈或我不会有问题?我可以信任单独的插入,还是应该将所有内容作为第二种方法插入到一个表中?

1 个答案:

答案 0 :(得分:1)

第一个版本通常被认为是关系数据库中的优越方法。您可能需要考虑仅包含对Products表的引用,而不是OrderProducts中有关该产品的所有信息(比PurchasedProducts更好的名称)。但是,值可能会随着时间的推移而发生变化,因此包含细节的原因也很充分。

第二版通常不适用于这种情况。从数据库的角度来看,ordered_products列是BLOB - 也就是说,它没有有用的内部结构。我的意思是,通过努力,您可以使用字符串或XML函数解析它。但你应该认为它真的是一种二进制类型。

为什么呢?通常,以下是人们想要问的问题类型:

  • 数据库中购买量最大的产品是什么?
  • 产品X的平均价格是多少?
  • 客户购买了哪些X和Y(虽然可能不是以相同的顺序)?
  • 订单的总价格基于其中的产品是什么?

使用单独的表OrderProducts可以更轻松地在数据库中回答所有这些问题。您应该利用数据库功能,并使用联结表。