那么,我有两种方法来存储我的客户购买的产品。但我想知道我应该使用哪一个,所以我在这里得到一些意见。
第一种方法是:最好的方法来存储客户产品
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 Key
order_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来确定哪些产品属于上次购买。但是这意味着如果两个人同时购买会有错误?一个人将不得不等待手术完成,因为瓶颈或者我不会有问题?我可以信任单独的插入,还是应该将所有内容插入一张表中作为第二种方法?
第二种方法还创建了每个条目259个字符*的开销,该字段约占整个字段的90%,假设产品名称为“我的示例产品”,价格为“123.45£”,数量为“42”。在整个行中,这可能会减少到浪费空间的70%,但这仍然是巨大的。 – Siguza
我实际上使用第一种方法,并使用外键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
@Siguza。 。 。规范化的数据通常需要额外的空间。外键引用可以改善这个问题。你应该学习适当的'join'语法。第一种方法更适合回答关于数据库中产品和订单的问题。 –