Продолжение.
Предыдущие части: 1-3, 4-6, 7-9, 10-13
Продолжение. Каскадное удаление данных.
Вы познакомились, я надеюсь, с основными концепциями создания баз данных и теперь вы можете спроектировать простую реляционную базу данных. В примере ниже я резюмирую задачи, с которыми вы столкнетесь при разработке базы данных.
P.S. Информация ниже в очень упрощенной форме моделирует мыслительный процесс при создании базы данных.
Для того, чтобы получить представление о данных, которые будут использоваться, давайте обозначим задачи, которые должен выполнять интернет-магазин.
Из списка задач мы можем вывести сущности, которые имеют важные роли в нашей системе. Товары, категории, клиенты и заказы – сущности, которые можно найти почти в каждой базе данных интернет-магазина. В данном примере я покажу вам модель, содержащую только следующие сущности: клиент, заказ и товар. Определившись с сущностями, мы можем подумать над связями между ними.
![image](https://habrastorage.org/r/w780q1/getpro/habr/post_images/e42/155/76c/e4215576c04e6323ec90c7b9657a594f.jpg)
Данная таблица является простым примером. “Настоящая” таблица клиентов, конечно, содержит больше информации (адрес, город и т.д.)
Некоторые замечания о данной модели.
Каждая запись таблицы заказов, каждый заказ связан с уникальной записью о клиенте, с уникальным клиентом с помощью внешнего ключа – поля customer_id.
Количество заказов.
Если вы задались вопросом, а можете ли вы добавить, например, поле количества заказов (order_quantity), то ответ – нет. Эти данные могут быть получены из существующих данных. Общее количество товаров в заказе (order_quantity) может быть получено из таблицы OrderProduct. Запрос, который находит количество товаров в заказе может быть легко сформирован с помощью SQL.
Тип платежа.
Поле, которое вы могли бы добавить в таблицу заказов – payment_type (тип платежа). Это информация уникальна для конкретного заказа и не может быть получена из других данных (имейте в виду, что поле payment_type стало бы внешним ключом в таблице заказов – order – с сылкой на отдельную таблицу, содержащую типы платежей).
Общая сумма заказа.
Еще одно поле, которое вы можете (а возможно и должны) добавить в таблицу order – это поле для общей суммы заказа. Но вы можете подумать, что эти данные мы можем получить из существующих. Вы ведь можете сложить стоимости всех товаров заказа? Да. И нет. Цена товара – это величина изменяемая. Поэтому когда вы подсчитаете общую стоимость заказа, сложив стоимости каждого его товара, а владелец магазина удвоит стоимость одного из товаров в заказе, то и общие стоимости всех уже выполненных заказов тоже изменятся. Иначе говоря, если высчитывать общую стоимость заказа при просмотре, а цены на товары могут меняться, то при этом самом просмотре истории может возникнуть такая ситуация, когда количество денег, которые вы заплатили за весь заказ, будет меняться. Вот почему лучше высчитывать общую стоимость в момент оформления заказа и хранить ее в таблице order.
Хранение истории цен на товары.
Говоря про историю, можно предположить, что вам может понадобится сохранять и историю цен на каждый товар. В этом случае вы бы могли посмотреть на дату заказа, сделать запрос к таблице price_history (история цен) и получить стоимость товара на дату оформления заказа. В данном случае вам не пришлось бы хранить общую стоимость заказа в таблице order. Я полагаю, что большинство интернет-магазинов сохраняют общую стоимость товаров заказа и не хранят историю цен на эти товары. Но, если говорить про вас, то разработчик вы и вам решать делать это или нет.
В таблице товаров цены на товары хранятся без учета НДС. Цена с НДС может быть вычислена с помощью программного кода или с помощью SQL-запроса. Вот почему я не храню цены с включенным НДС. Вы должны знать, что хранение стоимости товаров таким образом может иметь смысл и в будущем. В рассматриваемой модели цена товара хранится в единственном поле таблицы. Однажды изменив цену на товар, вы теряете прежнюю стоимость. Но если вы хотите иметь возможность получать отчеты о продажах в прошлом из вашей базы данных, то вы должны хранить историю цен для каждого товара. Если товар менял стоимость дважды в определенном году, то вам нужна история цен, чтобы знать сколько денег вы выручили за этот товар в данном году. А так как НДС, на величину которого возрастает цена товара при продаже, не достается вам, то и учитывать его в отчетах о полученной прибыли за товар бессмысленно.
Реляционные базы данных – это отличное средство для эффективного хранения большого количества информации. В данном руководстве я сфокусировался преимущественно на построении модели базы данных. Эта модель может быть реализована с помощью любой РСУБД, а запросы к ней могут выполняться с помощью SQL.
Если вы хотите разработать свою базу данных, то обязательно познакомьтесь с Mysql workbench. Это отличная утилита для создания диаграмм сущность-связь и не только. Я широко использую ее в своей работе разработчика программного обеспечения, даже если в работе не используется РСУБД Mysql.
Другим логичным шагом после прочтения данного руководства будет ознакомление со структурированным языком запросов (SQL). Моделирование баз данных с помощью Mysql workbench или управление ими с помощью Sqlyog – это все здорово, но… если вы действительно хотите понимать как пользоваться базами данных, то SQL – это навык без которого у вас этого не получится. У W3Schools имеются неплохие уроки по SQL, с которых вы можете начать.
Предыдущие части: 1-3, 4-6, 7-9, 10-13
Продолжение. Каскадное удаление данных.
14. Другой пример: база данных интернет-магазина.
Вы познакомились, я надеюсь, с основными концепциями создания баз данных и теперь вы можете спроектировать простую реляционную базу данных. В примере ниже я резюмирую задачи, с которыми вы столкнетесь при разработке базы данных.
P.S. Информация ниже в очень упрощенной форме моделирует мыслительный процесс при создании базы данных.
Система интернет-магазина.
Для того, чтобы получить представление о данных, которые будут использоваться, давайте обозначим задачи, которые должен выполнять интернет-магазин.
- Отображение товаров
- Классификация товаров
- Регистрация клиентов
- Добавление товаров в корзину покупок
- Отображение содержимого корзины покупок
- Оформление заказов посетителями
- И т.д.
Определяем сущности и отношения.
Из списка задач мы можем вывести сущности, которые имеют важные роли в нашей системе. Товары, категории, клиенты и заказы – сущности, которые можно найти почти в каждой базе данных интернет-магазина. В данном примере я покажу вам модель, содержащую только следующие сущности: клиент, заказ и товар. Определившись с сущностями, мы можем подумать над связями между ними.
- Между заказом и товаром существует связь многие-ко-многим. Каждый заказ содержит 1 или более товаров и каждый товар может быть связан с 0, 1 или большим количеством заказов. Связь многие-ко-многим создается с помощью трех таблиц. Две таблицы – источники данных (order — заказ и products — товары) и одна – соединительная (OrderProducts), что вы и можете увидеть на картинке ниже. Обратите внимание на то, что и заказы и товары имеют связь один-ко-многим с соединительной таблицей. Вместе они образуют связь многие-ко-многим между заказами и товарами.
- Клиенты и заказы имеют связь один-ко-многим. Каждая запись о клиенте может быть связана с множественными записями о заказах (заказами) и наоборот, каждая запись о заказе (конкретный заказ) может быть связана только с одной записью о клиенте.
![image](https://habrastorage.org/getpro/habr/post_images/e42/155/76c/e4215576c04e6323ec90c7b9657a594f.jpg)
Данная таблица является простым примером. “Настоящая” таблица клиентов, конечно, содержит больше информации (адрес, город и т.д.)
Некоторые замечания о данной модели.
Таблица заказов (order)
Каждая запись таблицы заказов, каждый заказ связан с уникальной записью о клиенте, с уникальным клиентом с помощью внешнего ключа – поля customer_id.
Количество заказов.
Если вы задались вопросом, а можете ли вы добавить, например, поле количества заказов (order_quantity), то ответ – нет. Эти данные могут быть получены из существующих данных. Общее количество товаров в заказе (order_quantity) может быть получено из таблицы OrderProduct. Запрос, который находит количество товаров в заказе может быть легко сформирован с помощью SQL.
Тип платежа.
Поле, которое вы могли бы добавить в таблицу заказов – payment_type (тип платежа). Это информация уникальна для конкретного заказа и не может быть получена из других данных (имейте в виду, что поле payment_type стало бы внешним ключом в таблице заказов – order – с сылкой на отдельную таблицу, содержащую типы платежей).
Общая сумма заказа.
Еще одно поле, которое вы можете (а возможно и должны) добавить в таблицу order – это поле для общей суммы заказа. Но вы можете подумать, что эти данные мы можем получить из существующих. Вы ведь можете сложить стоимости всех товаров заказа? Да. И нет. Цена товара – это величина изменяемая. Поэтому когда вы подсчитаете общую стоимость заказа, сложив стоимости каждого его товара, а владелец магазина удвоит стоимость одного из товаров в заказе, то и общие стоимости всех уже выполненных заказов тоже изменятся. Иначе говоря, если высчитывать общую стоимость заказа при просмотре, а цены на товары могут меняться, то при этом самом просмотре истории может возникнуть такая ситуация, когда количество денег, которые вы заплатили за весь заказ, будет меняться. Вот почему лучше высчитывать общую стоимость в момент оформления заказа и хранить ее в таблице order.
Хранение истории цен на товары.
Говоря про историю, можно предположить, что вам может понадобится сохранять и историю цен на каждый товар. В этом случае вы бы могли посмотреть на дату заказа, сделать запрос к таблице price_history (история цен) и получить стоимость товара на дату оформления заказа. В данном случае вам не пришлось бы хранить общую стоимость заказа в таблице order. Я полагаю, что большинство интернет-магазинов сохраняют общую стоимость товаров заказа и не хранят историю цен на эти товары. Но, если говорить про вас, то разработчик вы и вам решать делать это или нет.
Таблица товаров.
В таблице товаров цены на товары хранятся без учета НДС. Цена с НДС может быть вычислена с помощью программного кода или с помощью SQL-запроса. Вот почему я не храню цены с включенным НДС. Вы должны знать, что хранение стоимости товаров таким образом может иметь смысл и в будущем. В рассматриваемой модели цена товара хранится в единственном поле таблицы. Однажды изменив цену на товар, вы теряете прежнюю стоимость. Но если вы хотите иметь возможность получать отчеты о продажах в прошлом из вашей базы данных, то вы должны хранить историю цен для каждого товара. Если товар менял стоимость дважды в определенном году, то вам нужна история цен, чтобы знать сколько денег вы выручили за этот товар в данном году. А так как НДС, на величину которого возрастает цена товара при продаже, не достается вам, то и учитывать его в отчетах о полученной прибыли за товар бессмысленно.
15. Вывод и дальнейшее чтение.
Реляционные базы данных – это отличное средство для эффективного хранения большого количества информации. В данном руководстве я сфокусировался преимущественно на построении модели базы данных. Эта модель может быть реализована с помощью любой РСУБД, а запросы к ней могут выполняться с помощью SQL.
Куда двигаться дальше?
Если вы хотите разработать свою базу данных, то обязательно познакомьтесь с Mysql workbench. Это отличная утилита для создания диаграмм сущность-связь и не только. Я широко использую ее в своей работе разработчика программного обеспечения, даже если в работе не используется РСУБД Mysql.
Другим логичным шагом после прочтения данного руководства будет ознакомление со структурированным языком запросов (SQL). Моделирование баз данных с помощью Mysql workbench или управление ими с помощью Sqlyog – это все здорово, но… если вы действительно хотите понимать как пользоваться базами данных, то SQL – это навык без которого у вас этого не получится. У W3Schools имеются неплохие уроки по SQL, с которых вы можете начать.