Ну, у меня есть два способа хранения продуктов, приобретенных моими клиентами. Но мне интересно, что я должен использовать, поэтому я здесь, чтобы получить некоторые мнения.
Первый способ заключается в том, что:Лучший способ хранения продуктов для клиентов
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();
Теперь объясним: с описанным выше способом я вставить заказ в одной таблице и закупаемой продукции в другой таблице, и после я могу показать каждый из продуктов, купленных любого клиента в таблице 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();
С помощью этого метода я могу показать продукты непосредственно в таблицах только с таблицей ключевых purchased_products
. Какой метод лучше? Если я использую первый, я могу выполнять операции со значением, но ... Я изучал и узнал, что вставка сделана как узкое место. Идентификатор покупки присваивается автоматически, а затем я использую lastInsertionId для определения того, какие продукты относятся к предыдущей покупке. Но это означает, что если два человека будут покупать одновременно, у них будут ошибки? Нужно будет ждать завершения операции, потому что узкое место или у меня не будет проблем? Могу ли я доверять отдельным вставкам или мне нужно вставлять все в одну таблицу в качестве второго метода?
Второй способ также создает накладные расходы на 259 символов * за запись *, что составляет около 90% всего поля, при условии, что название продукта «Мой примерный продукт», цена «123,45 £» и количество "42". По всей строке, которая, вероятно, уменьшится до 70% потраченного впустую пространства, но это все еще огромно. – Siguza
Я использую первый метод и выполняю запрос с использованием Foreign Key order_id, как я упоминал в вопросе: 'SELECT * FROM orders o, purchase_products pp WHERE o.customer_id LIKE {$ user_id} И pp.order_id = o.order_id ORDER BY o.order_id DESC' работает нормально. Я просто не понял, что вы имеете в виду по этому методу в своем ответе.Можете ли вы быть более конкретным? – Dyan
@Siguza. , , Для нормализованных данных часто требуется дополнительное пространство. Ссылки на внешние ключи могут облегчить эту проблему. Вы должны изучить правильный синтаксис 'join'. Первый способ является предпочтительным для ответов на вопросы о продуктах и заказах в базе данных. –