Как связаны таблицы
В начале этого курса мы рассказывали о преимуществах баз данных перед обычными электронными таблицами. Возможно, вы ещё не успели их заметить, и неудивительно.
До сих пор вы работали только с одной таблицей: получали срез, группировали и сортировали данные. Особенности баз проявляются в случаях, когда данных много и их делят на несколько таблиц. И чем сильнее «дробят» информацию, тем лучше.
Покажем на примере таблицы с заказами:
На первый взгляд кажется, что с такой таблицей можно работать. Но присмотритесь внимательнее: в таблице много повторов. Данные покупателей дублируются, как и сами товары. Тут нет ошибки, ведь один человек может купить несколько предметов и один предмет могут купить несколько человек.
Теперь представьте, что таблица со временем выросла до двух миллионов записей. Работать с ней уже не так удобно: она занимает больше места и искать информацию нужно дольше. К тому же если адрес покупателя или цена товара изменились, то вносить правки придётся несколько раз.
Три таблицы вместо одной
Повторяющиеся данные можно оптимизировать, разделив огромную таблицу на несколько таблиц поменьше.
Таблица с заказами
Таблица с товарами
Таблица с покупателями
Теперь информации в таблицах стало меньше. Но как узнать, кто что и когда покупал?
Выручит первичный ключ — назначим его таблицам с товарами и покупателями.
Теперь свяжем таблицы между собой. В таблице с заказами укажем, кто и что покупал. Но вместо того, чтобы добавлять всю информацию, укажем только номера идентификаторов — покупателей и товаров.
Таблица с заказами теперь не такая массивная. Может показаться, что пользоваться ей стало неудобно, ведь в ней остались одни числа. На самом деле информация из неё никуда не пропала. Например, чтобы проверить, кто покупал дрель «Зубр», нужно взять идентификатор
5 из таблицы с заказами и посмотреть, какому покупателю он соответствует. Таблица с заказами будет увеличиваться с каждым новым заказом. Так и таблицы с клиентами и товарами будут расти в случае, если появится новый покупатель или товар. Данные при этом дублироваться не будут.
Теперь покажем, как такие связи реализованы в базе данных интернет-магазина, с которой вы уже знакомы.
Вспомните таблицу
invoice, которая хранит записи о заказах. В этой таблице есть данные и о пользователях: у каждого пользователя свой идентификатор, который хранится в поле customer_id. Но как узнать, что это за пользователь? Фамилии и имена хранятся в другой таблице — client. Если выгрузить заказы вместе с фамилией и именем пользователя, такая таблица получится информативнее.Как связывают таблицы
Повторимся: главное отличие базы от обычного хранилища данных в том, что в базе данных таблицы связаны между собой. Эти связи формируются с помощью ключей. Вы уже знакомы с первичным ключом — это уникальный признак записи. Кроме первичного ключа, существует внешний ключ — это поле, которое отсылает к первичному ключу другой таблицы. Другими словами, внешний ключ указывает на запись другой таблицы.
Объясним на примере. В таблице
invoice поле invoice_id — первичный ключ, он уникальный и неповторимый. Поле customer_id хранит идентификаторы пользователей, но кто стоит за этими идентификаторами, пока неизвестно. Нужные данные есть в таблице
client. В этой таблице первичным ключом будет поле customer_id. Теперь можно сравнить две таблицы и понять, что покупателя с идентификатором 8, который сделал заказ 3 января 2009 года, зовут Daan Peeters. Подытожим: поле
customer_id встречается в таблицах invoice и client, и с его помощью удалось соединить две таблицы. Для таблицы
invoice поле customer_id будет внешним ключом, который отсылает ко второй таблице — client. В таблице invoice идентификатор пользователя может повторяться, ведь один и тот же покупатель может оформить несколько заказов. Но в таблице client значения в поле customer_id не повторяются — для каждого пользователя только одна запись.Подведём итоги:
- Хранить все данные в одной таблице непрактично. Лучше разделить данные на несколько таблиц и связывать их между собой. Искать информацию будет проще и быстрее.
- Таблицы можно связать ключами — первичными и внешними. Например, всем клиентам можно назначить идентификаторы, чтобы с их помощью связать покупателя с заказом.
- Таблица, состоящая из одних чисел-идентификаторов, кажется нечитаемой, но средствами SQL её можно привести к удобному виду. Как это сделать, расскажем в следующих уроках.