2015-06-20 32 views
0

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

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(); 

现在让我们来解释一下:上面我插入一个表格和所购买的产品在另一个表中的顺序,和之后的方法我可以显示所购买产品的每一个通过使用purchased_products表中的Foreign Keyorder_id表格中的任何客户。

现在我有第二个方法:

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(); 

使用这种方法,我可以展示产品直接在表中只能用表键purchased_products。 什么方法最好?如果我使用第一个,我可以用这个值进行操作,但是......我一直在研究并了解到插入是制造瓶颈。购买ID是自动分配的,然后我使用lastInsertionId来确定哪些产品属于上次购买。但是这意味着如果两个人同时购买会有错误?一个人将不得不等待手术完成,因为瓶颈或者我不会有问题?我可以信任单独的插入,还是应该将所有内容插入一张表中作为第二种方法?

回答

1

第一个版本通常被认为是关系数据库中的上级方法。您可能需要考虑仅包含对Products表的引用,而不是关于OrderProducts(比PurchasedProducts更好的名称)中的产品的所有信息。但是,这些值可能会随着时间而改变,所以也包含详细信息的一个很好的理由。

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

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

  • 什么是顶部购买的产品在数据库中?
  • 产品X的平均价格是多少?
  • 顾客同时购买了X和Y(虽然可能不是同一订单)?
  • 根据订单中的产品订单的总价格是多少?

所有这些都很容易在数据库中用单独的表格OrderProducts回答。您应该利用数据库功能,并使用联结表。

+0

第二种方法还创建了每个条目259个字符*的开销,该字段约占整个字段的90%,假设产品名称为“我的示例产品”,价格为“123.45£”,数量为“42”。在整个行中,这可能会减少到浪费空间的70%,但这仍然是巨大的。 – Siguza

+0

我实际上使用第一种方法,并使用外键order_id进行查询,正如我在问题中提到的:'SELECT * FROM orders o,purchased_products pp WHERE o.customer_id LIKE {$ user_id} AND pp.order_id = o.order_id ORDER BY o.order_id DESC'工作正常。在你的回答中,我只是没有想到你对这种方法意味着什么。你能更具体吗? – Dyan

+0

@Siguza。 。 。规范化的数据通常需要额外的空间。外键引用可以改善这个问题。你应该学习适当的'join'语法。第一种方法更适合回答关于数据库中产品和订单的问题。 –

相关问题