好吧,我在这里有两种方法来存储我的客户购买的产品。但我想知道我应该使用哪一个,所以我在这里得到一些意见 第一种方法是:
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确定哪些产品属于上次购买。但这意味着,如果两个人同时购买会有错误吗?人们将不得不等待操作完成,因为瓶颈或我不会有问题?我可以信任单独的插入,还是应该将所有内容作为第二种方法插入到一个表中?
答案 0 :(得分:1)
第一个版本通常被认为是关系数据库中的优越方法。您可能需要考虑仅包含对Products
表的引用,而不是OrderProducts
中有关该产品的所有信息(比PurchasedProducts
更好的名称)。但是,值可能会随着时间的推移而发生变化,因此包含细节的原因也很充分。
第二版通常不适用于这种情况。从数据库的角度来看,ordered_products
列是BLOB - 也就是说,它没有有用的内部结构。我的意思是,通过努力,您可以使用字符串或XML函数解析它。但你应该认为它真的是一种二进制类型。
为什么呢?通常,以下是人们想要问的问题类型:
使用单独的表OrderProducts
可以更轻松地在数据库中回答所有这些问题。您应该利用数据库功能,并使用联结表。