2015-06-20 3 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(); 

Теперь объясним: с описанным выше способом я вставить заказ в одной таблице и закупаемой продукции в другой таблице, и после я могу показать каждый из продуктов, купленных любого клиента в таблице HTML, используя Foreign Keyorder_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 для определения того, какие продукты относятся к предыдущей покупке. Но это означает, что если два человека будут покупать одновременно, у них будут ошибки? Нужно будет ждать завершения операции, потому что узкое место или у меня не будет проблем? Могу ли я доверять отдельным вставкам или мне нужно вставлять все в одну таблицу в качестве второго метода?

ответ

1

Первая версия, как правило, считается превосходным методом в реляционной базе данных. Возможно, вы захотите рассмотреть возможность включения ссылки на таблицу Products вместо всей информации о продукте в OrderProducts (лучшее имя, чем PurchasedProducts). Тем не менее, значения могут меняться со временем, поэтому есть также хорошая причина для включения деталей.

Вторая версия, как правило, неприменима в этой ситуации. С точки зрения базы данных столбец ordered_products представляет собой BLOB, то есть он не имеет полезной внутренней структуры. Я имею в виду, что вы можете проанализировать его, используя строковые или XML-функции. Но вы должны думать, что действительно думаете об этом как о двоичном типе.

Почему? Обычно задаются следующие вопросы, которые люди хотят задать:

  • Что такое верхние покупные продукты в базе данных?
  • Какова средняя цена продукта X?
  • Какие покупатели приобрели как X, так и Y (хотя, возможно, не в том же порядке)?
  • Какова общая стоимость заказа на основе продуктов, которые в нем?

Все это проще в базе данных с отдельной таблицей, OrderProducts. Вы должны использовать функциональность базы данных и использовать таблицу соединений.

+0

Второй способ также создает накладные расходы на 259 символов * за запись *, что составляет около 90% всего поля, при условии, что название продукта «Мой примерный продукт», цена «123,45 £» и количество "42". По всей строке, которая, вероятно, уменьшится до 70% потраченного впустую пространства, но это все еще огромно. – Siguza

+0

Я использую первый метод и выполняю запрос с использованием 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

+0

@Siguza. , , Для нормализованных данных часто требуется дополнительное пространство. Ссылки на внешние ключи могут облегчить эту проблему. Вы должны изучить правильный синтаксис 'join'. Первый способ является предпочтительным для ответов на вопросы о продуктах и ​​заказах в базе данных. –

Смежные вопросы