0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Таблицы - необходимый компонент баз данных. Чтобы построить аналитику, мы часто агрегируем данные из таблиц и строим графики. Но иногда анализ самой таблицы без графиков оказывается удобнее.</p>
1
<p>Таблицы - необходимый компонент баз данных. Чтобы построить аналитику, мы часто агрегируем данные из таблиц и строим графики. Но иногда анализ самой таблицы без графиков оказывается удобнее.</p>
2
<p>В этом уроке мы рассмотрим, что такое таблица, какие существуют отношения между таблицами, и как проектировать таблицы. Мы агрегируем данные продаж по товарам и найдем самые прибыльные из них.</p>
2
<p>В этом уроке мы рассмотрим, что такое таблица, какие существуют отношения между таблицами, и как проектировать таблицы. Мы агрегируем данные продаж по товарам и найдем самые прибыльные из них.</p>
3
<p>С более глубокими знаниями о таблицах можно проводить хорошую и разностороннюю аналитику и выбирать нужный метод анализа под каждую задачу.</p>
3
<p>С более глубокими знаниями о таблицах можно проводить хорошую и разностороннюю аналитику и выбирать нужный метод анализа под каждую задачу.</p>
4
<h2>Таблица</h2>
4
<h2>Таблица</h2>
5
<p>Для начала рассмотрим, что такое таблица в базе данных. Посмотрим на пример ниже:</p>
5
<p>Для начала рассмотрим, что такое таблица в базе данных. Посмотрим на пример ниже:</p>
6
<p>Таблица содержит информация о разных пиццериях. В ней есть следующие столбцы:</p>
6
<p>Таблица содержит информация о разных пиццериях. В ней есть следующие столбцы:</p>
7
<ul><li>Название - это название пиццерии</li>
7
<ul><li>Название - это название пиццерии</li>
8
<li>Доставка - есть у пиццерии доставка или нет</li>
8
<li>Доставка - есть у пиццерии доставка или нет</li>
9
<li>Начало работы - с какого времени открыта пиццерия</li>
9
<li>Начало работы - с какого времени открыта пиццерия</li>
10
</ul><p>Вся информация в таблице - это параметры разных пиццерий, то есть смысл этой таблицы. Смысл называется<strong>сущностью</strong>- это то, о чем хранится информация в таблице.</p>
10
</ul><p>Вся информация в таблице - это параметры разных пиццерий, то есть смысл этой таблицы. Смысл называется<strong>сущностью</strong>- это то, о чем хранится информация в таблице.</p>
11
<p>Для таблиц как сущностей есть такое правило: одна таблица - одна сущность. Например, в таблице Users хранится только информация о пользователях, в таблице Payments - о платежах, а в таблице выше - о пиццериях.</p>
11
<p>Для таблиц как сущностей есть такое правило: одна таблица - одна сущность. Например, в таблице Users хранится только информация о пользователях, в таблице Payments - о платежах, а в таблице выше - о пиццериях.</p>
12
<p>Таблицы в базах данных могут быть связаны друг с другом. Такие базы называются<strong>реляционными</strong>.</p>
12
<p>Таблицы в базах данных могут быть связаны друг с другом. Такие базы называются<strong>реляционными</strong>.</p>
13
<p>В реляционных базах содержатся предопределенные связи между таблицами. В каждой таблице хранится информация об отдельной сущности, но эти сущности могут быть связаны.</p>
13
<p>В реляционных базах содержатся предопределенные связи между таблицами. В каждой таблице хранится информация об отдельной сущности, но эти сущности могут быть связаны.</p>
14
<p>Например, таблица Users хранит информацию о пользователе - его ФИО, адрес электронной почты и другие его параметры. Но каждый пользователь совершает какой-то платеж, и эти платежи хранятся в таблице Payments.</p>
14
<p>Например, таблица Users хранит информацию о пользователе - его ФИО, адрес электронной почты и другие его параметры. Но каждый пользователь совершает какой-то платеж, и эти платежи хранятся в таблице Payments.</p>
15
<p>Таблицы Users и Payments связаны. Такие связи называются<strong>отношениями</strong>между сущностями. Язык SQL - это основной инструмент работы с реляционными базами данных.</p>
15
<p>Таблицы Users и Payments связаны. Такие связи называются<strong>отношениями</strong>между сущностями. Язык SQL - это основной инструмент работы с реляционными базами данных.</p>
16
<p>У таблиц в реляционных базах данных есть разные компоненты. Их использование является одним из необходимых условий реляционной модели, потому что они позволяют связывать разные сущности. Рассмотрим их подробнее.</p>
16
<p>У таблиц в реляционных базах данных есть разные компоненты. Их использование является одним из необходимых условий реляционной модели, потому что они позволяют связывать разные сущности. Рассмотрим их подробнее.</p>
17
<h3>Компоненты таблицы</h3>
17
<h3>Компоненты таблицы</h3>
18
<p>Обязательные компоненты таблиц такие:</p>
18
<p>Обязательные компоненты таблиц такие:</p>
19
<ul><li>Столбец</li>
19
<ul><li>Столбец</li>
20
<li>Строка</li>
20
<li>Строка</li>
21
<li>Домен</li>
21
<li>Домен</li>
22
<li>Ключ</li>
22
<li>Ключ</li>
23
</ul><p>Столбец в таблицах еще называют<strong>колонкой</strong>*,<strong>полем</strong>или<strong>атрибутом</strong>. Атрибут таблицы выражает какой-то один тип информации о сущности. Например, в таблице Users может храниться поле Full name, и оно содержит информацию о ФИО пользователя. Поле User address будет хранить адрес пользователя. В колонке Название в таблице пиццерий мы видим название конкретной пиццерии.</p>
23
</ul><p>Столбец в таблицах еще называют<strong>колонкой</strong>*,<strong>полем</strong>или<strong>атрибутом</strong>. Атрибут таблицы выражает какой-то один тип информации о сущности. Например, в таблице Users может храниться поле Full name, и оно содержит информацию о ФИО пользователя. Поле User address будет хранить адрес пользователя. В колонке Название в таблице пиццерий мы видим название конкретной пиццерии.</p>
24
<p>Строки мы еще зовем<strong>записью</strong>или<strong>кортежем</strong>. Одна строка - это одна единица сущности. В таблице Users одна запись - это один пользователь, в Payments - это один платеж, в Пиццерии - одна пиццерия.</p>
24
<p>Строки мы еще зовем<strong>записью</strong>или<strong>кортежем</strong>. Одна строка - это одна единица сущности. В таблице Users одна запись - это один пользователь, в Payments - это один платеж, в Пиццерии - одна пиццерия.</p>
25
<p>При создании таблицы в базе данных мы обязательно указываем<strong>тип данных</strong>информации в поле.<strong>Домен</strong>поля - это и есть тип данных столбца. К примеру, поле Full name в таблице Users может содержать строку и ничего кроме строки.</p>
25
<p>При создании таблицы в базе данных мы обязательно указываем<strong>тип данных</strong>информации в поле.<strong>Домен</strong>поля - это и есть тип данных столбца. К примеру, поле Full name в таблице Users может содержать строку и ничего кроме строки.</p>
26
<p>Вот примеры доменов полей:</p>
26
<p>Вот примеры доменов полей:</p>
27
<ul><li>Строка</li>
27
<ul><li>Строка</li>
28
<li>Целое число</li>
28
<li>Целое число</li>
29
<li>Число с плавающей точкой и прочее</li>
29
<li>Число с плавающей точкой и прочее</li>
30
</ul><p>Мы уже упомянули, что таблицы в реляционных базах данных связаны. Чтобы связать две таблицы, мы используем специальное поле, которое называется<strong>ключ</strong>. В таблице Users и Payments такой ключ - это колонка UserID. Мы связываем эти две таблицы с помощью оператора join.</p>
30
</ul><p>Мы уже упомянули, что таблицы в реляционных базах данных связаны. Чтобы связать две таблицы, мы используем специальное поле, которое называется<strong>ключ</strong>. В таблице Users и Payments такой ключ - это колонка UserID. Мы связываем эти две таблицы с помощью оператора join.</p>
31
<p>Ключ, который является уникальным для всей таблицы, - это<strong>первичный ключ</strong>. В таблице Users каждый пользователь имеет свой уникальный UserID, и два пользователя не могут иметь один UserID. Но в таблице Payments один пользователь может совершить несколько платежей, поэтому бывают строки с одинаковыми UserID.</p>
31
<p>Ключ, который является уникальным для всей таблицы, - это<strong>первичный ключ</strong>. В таблице Users каждый пользователь имеет свой уникальный UserID, и два пользователя не могут иметь один UserID. Но в таблице Payments один пользователь может совершить несколько платежей, поэтому бывают строки с одинаковыми UserID.</p>
32
<p>В то же время первичный ключ PaymentID для этой таблицы бывает только уникальным, поскольку одна строка - это один платеж, и они не могут повторяться.</p>
32
<p>В то же время первичный ключ PaymentID для этой таблицы бывает только уникальным, поскольку одна строка - это один платеж, и они не могут повторяться.</p>
33
<p>Таблицы в реляционных базах данных связаны друг с другом, и сейчас мы рассмотрим разные типы отношений между таблицами.</p>
33
<p>Таблицы в реляционных базах данных связаны друг с другом, и сейчас мы рассмотрим разные типы отношений между таблицами.</p>
34
<h2>Отношения таблиц</h2>
34
<h2>Отношения таблиц</h2>
35
<p>Мы уже сказали, что мы можем связывать разные таблицы в базах данных. Есть такие типы<strong>связей</strong>или<strong>отношений</strong>:</p>
35
<p>Мы уже сказали, что мы можем связывать разные таблицы в базах данных. Есть такие типы<strong>связей</strong>или<strong>отношений</strong>:</p>
36
<ul><li>Один к одному</li>
36
<ul><li>Один к одному</li>
37
<li>Один ко многим</li>
37
<li>Один ко многим</li>
38
<li>Многие ко многим</li>
38
<li>Многие ко многим</li>
39
</ul><p>Рассмотрим каждый из этих типов.</p>
39
</ul><p>Рассмотрим каждый из этих типов.</p>
40
<h3>Один к одному</h3>
40
<h3>Один к одному</h3>
41
<p>Представим, что у нас есть база данных пользователей интернет-магазина. Посмотрим на таблицу Users, в которой есть информация о пользователях:</p>
41
<p>Представим, что у нас есть база данных пользователей интернет-магазина. Посмотрим на таблицу Users, в которой есть информация о пользователях:</p>
42
<p><strong>users</strong></p>
42
<p><strong>users</strong></p>
43
<p>В этой таблице мы видим три поля:</p>
43
<p>В этой таблице мы видим три поля:</p>
44
<ul><li>UserID - ID покупателя</li>
44
<ul><li>UserID - ID покупателя</li>
45
<li>Full name - имя и фамилия покупателя</li>
45
<li>Full name - имя и фамилия покупателя</li>
46
<li>Email - адрес электронной почты</li>
46
<li>Email - адрес электронной почты</li>
47
</ul><p>Теперь топ-менеджер магазина сообщил нам, что мы должны внести новое поле: есть ли у покупателя скидочная карта или нет. В нашей таблице уже хранится 10 000 строк, поэтому вписывать в каждую наличие скидочной карты будет долго. При этом один покупатель мог быть вписан в таблицу несколько раз, если он менял адрес электронной почты.</p>
47
</ul><p>Теперь топ-менеджер магазина сообщил нам, что мы должны внести новое поле: есть ли у покупателя скидочная карта или нет. В нашей таблице уже хранится 10 000 строк, поэтому вписывать в каждую наличие скидочной карты будет долго. При этом один покупатель мог быть вписан в таблицу несколько раз, если он менял адрес электронной почты.</p>
48
<p>Чтобы решить эту задачу просто, мы создадим новую таблицу Users discount card, в которой будет всего два поля:</p>
48
<p>Чтобы решить эту задачу просто, мы создадим новую таблицу Users discount card, в которой будет всего два поля:</p>
49
<ul><li>ID покупателя</li>
49
<ul><li>ID покупателя</li>
50
<li>Наличие у покупателя скидочной карты</li>
50
<li>Наличие у покупателя скидочной карты</li>
51
</ul><p>При этом, чтобы не вписывать наличие карты у одного и того же покупателя несколько раз, мы сделаем поле UserID уникальным.</p>
51
</ul><p>При этом, чтобы не вписывать наличие карты у одного и того же покупателя несколько раз, мы сделаем поле UserID уникальным.</p>
52
<p>Посмотрим на такую таблицу:</p>
52
<p>Посмотрим на такую таблицу:</p>
53
<p><strong>users_discount_card</strong></p>
53
<p><strong>users_discount_card</strong></p>
54
<p>Таблица содержит только UserID и Discount card - есть у пользователя скидочная карта или нет. Теперь эту таблицу легко связать с таблицей Users по UserID с помощью SQL-функции join и получить для каждого пользователя наличие у него скидочной карты. При этом нам не нужно вносить в Users новое поле.</p>
54
<p>Таблица содержит только UserID и Discount card - есть у пользователя скидочная карта или нет. Теперь эту таблицу легко связать с таблицей Users по UserID с помощью SQL-функции join и получить для каждого пользователя наличие у него скидочной карты. При этом нам не нужно вносить в Users новое поле.</p>
55
<p>Такие отношения между таблицами называются<strong>один к одному</strong>. В таком типе отношений только одному пользователю соответствует только одна метка наличия карты.</p>
55
<p>Такие отношения между таблицами называются<strong>один к одному</strong>. В таком типе отношений только одному пользователю соответствует только одна метка наличия карты.</p>
56
<h3>Один ко многим</h3>
56
<h3>Один ко многим</h3>
57
<p>Теперь предположим, что мы хотим хранить в таблице Users номера телефонов покупателей. У одного покупателя может быть несколько номеров телефонов, но один номер телефона принадлежит только одному покупателю. Эта связь называется<strong>один ко многим</strong>.</p>
57
<p>Теперь предположим, что мы хотим хранить в таблице Users номера телефонов покупателей. У одного покупателя может быть несколько номеров телефонов, но один номер телефона принадлежит только одному покупателю. Эта связь называется<strong>один ко многим</strong>.</p>
58
<p>Для этого мы создадим новую таблицу Phones:</p>
58
<p>Для этого мы создадим новую таблицу Phones:</p>
59
<p><strong>users</strong></p>
59
<p><strong>users</strong></p>
60
<p>В этой таблице есть три поля:</p>
60
<p>В этой таблице есть три поля:</p>
61
<ul><li>PhoneID - ID номера телефона</li>
61
<ul><li>PhoneID - ID номера телефона</li>
62
<li>UserID - ID покупателя, которому принадлежит телефон</li>
62
<li>UserID - ID покупателя, которому принадлежит телефон</li>
63
<li>Phone - номер телефона</li>
63
<li>Phone - номер телефона</li>
64
</ul><p>При этом PhoneID должен быть в таблице уникален, но, как мы видим, UserID повторяется. Это значит, что у одного покупателя есть несколько номеров.</p>
64
</ul><p>При этом PhoneID должен быть в таблице уникален, но, как мы видим, UserID повторяется. Это значит, что у одного покупателя есть несколько номеров.</p>
65
<h3>Многие ко многим</h3>
65
<h3>Многие ко многим</h3>
66
<p>Чтобы понять отношение<strong>многие ко многим</strong>, рассмотрим еще одну таблицу Products:</p>
66
<p>Чтобы понять отношение<strong>многие ко многим</strong>, рассмотрим еще одну таблицу Products:</p>
67
<p><strong>products</strong></p>
67
<p><strong>products</strong></p>
68
<p>В таблице содержится список товаров магазина - ID товара и наименование. Мы хотим связать, какие товары какой покупатель приобрел. При этом один покупатель может купить много разных товаров, но и один и тот же товар могут купить разные люди. Таблица-отношение между таблицами Users и Products будет выглядеть так:</p>
68
<p>В таблице содержится список товаров магазина - ID товара и наименование. Мы хотим связать, какие товары какой покупатель приобрел. При этом один покупатель может купить много разных товаров, но и один и тот же товар могут купить разные люди. Таблица-отношение между таблицами Users и Products будет выглядеть так:</p>
69
<p><strong>users_products</strong></p>
69
<p><strong>users_products</strong></p>
70
<p>В этой таблице мы видим, что пользователь с ID = 1 купил товары с ID 10 и 5, но товар 10 купили два пользователя: с ID = 1 и ID = 6. Такие отношения и есть "многие ко многим".</p>
70
<p>В этой таблице мы видим, что пользователь с ID = 1 купил товары с ID 10 и 5, но товар 10 купили два пользователя: с ID = 1 и ID = 6. Такие отношения и есть "многие ко многим".</p>
71
<p>Кроме того, что существуют разные виды отношений между таблицами, само проектирование баз данных и таблиц возможно несколькими способами.</p>
71
<p>Кроме того, что существуют разные виды отношений между таблицами, само проектирование баз данных и таблиц возможно несколькими способами.</p>
72
<h2>Проектирование таблиц</h2>
72
<h2>Проектирование таблиц</h2>
73
<p>Есть такие виды проектирования баз данных:</p>
73
<p>Есть такие виды проектирования баз данных:</p>
74
<ul><li>Концептуальное моделирование</li>
74
<ul><li>Концептуальное моделирование</li>
75
<li>Логическое моделирование</li>
75
<li>Логическое моделирование</li>
76
<li>Физическое моделирование</li>
76
<li>Физическое моделирование</li>
77
</ul><p>Концептуальное проектирование заключается в том, что мы описываем, какие у нас будут сущности в базе данных и отношения. Сущности, как мы говорили выше - это отдельные таблицы. Отношения - какие сущности и как будут связаны друг с другом: "один к одному", "один ко многим" или "многие ко многим". То, о чем мы говорили выше, - это концептуальное проектирование.</p>
77
</ul><p>Концептуальное проектирование заключается в том, что мы описываем, какие у нас будут сущности в базе данных и отношения. Сущности, как мы говорили выше - это отдельные таблицы. Отношения - какие сущности и как будут связаны друг с другом: "один к одному", "один ко многим" или "многие ко многим". То, о чем мы говорили выше, - это концептуальное проектирование.</p>
78
<p>Логическое проектирование дополняет концептуальное тем, что мы уже рассматриваем особенности модели данных, которые будут храниться в базе данных. Модели данных бывают реляционными, нереляционными и другими.</p>
78
<p>Логическое проектирование дополняет концептуальное тем, что мы уже рассматриваем особенности модели данных, которые будут храниться в базе данных. Модели данных бывают реляционными, нереляционными и другими.</p>
79
<p>Физическое моделирование уже учитывает проектирование на уровне особенностей каждой отдельной базы данных: PostgreSQL, MySQL. При физическом моделировании мы выбираем, какие запросы нам важны больше всего: чтение из таблицы или запись в таблицу, и производим тестирование на пропускную способность.</p>
79
<p>Физическое моделирование уже учитывает проектирование на уровне особенностей каждой отдельной базы данных: PostgreSQL, MySQL. При физическом моделировании мы выбираем, какие запросы нам важны больше всего: чтение из таблицы или запись в таблицу, и производим тестирование на пропускную способность.</p>
80
<p>Как правило, разные типы моделирования используются при проектировании одной и той же базы данных:</p>
80
<p>Как правило, разные типы моделирования используются при проектировании одной и той же базы данных:</p>
81
<ol><li>Концептуально описываем схему базы данных и сущности, которые там содержатся</li>
81
<ol><li>Концептуально описываем схему базы данных и сущности, которые там содержатся</li>
82
<li>Выбираем модель данных в логическом моделировании</li>
82
<li>Выбираем модель данных в логическом моделировании</li>
83
<li>Рассматриваем более детально реализацию базы данных в конкретном хранилище с учетом конкретной базы, которую мы выбрали</li>
83
<li>Рассматриваем более детально реализацию базы данных в конкретном хранилище с учетом конкретной базы, которую мы выбрали</li>
84
</ol><p>Таким образом, проектирование одной базы данных обычно проходит через все три этапа. Каждый следующий этап дополняет и уточняет предыдущий.</p>
84
</ol><p>Таким образом, проектирование одной базы данных обычно проходит через все три этапа. Каждый следующий этап дополняет и уточняет предыдущий.</p>
85
<p>Мы знаем, что называется таблицей в базе данных, какие отношения между таблицами существуют и какие есть типы проектирования баз данных. Теперь перейдем к практике и агрегируем таблицу продаж.</p>
85
<p>Мы знаем, что называется таблицей в базе данных, какие отношения между таблицами существуют и какие есть типы проектирования баз данных. Теперь перейдем к практике и агрегируем таблицу продаж.</p>
86
<h2>Агрегация таблицы продаж</h2>
86
<h2>Агрегация таблицы продаж</h2>
87
<p>Рассмотрим базу данных<a>table</a>. В ней есть одна таблица sales, которая содержит информацию о покупках в магазине. Посмотрим на эту таблицу:</p>
87
<p>Рассмотрим базу данных<a>table</a>. В ней есть одна таблица sales, которая содержит информацию о покупках в магазине. Посмотрим на эту таблицу:</p>
88
<p><strong>sales</strong></p>
88
<p><strong>sales</strong></p>
89
<p>В этой таблице мы видим информацию о покупателях и купленных товарах.</p>
89
<p>В этой таблице мы видим информацию о покупателях и купленных товарах.</p>
90
<p>Мы хотим определить из таблицы топ-5 самых прибыльных товаров. Наименование товара указано в поле product_name, а прибыль - в sales. Напишем SQL-запрос:</p>
90
<p>Мы хотим определить из таблицы топ-5 самых прибыльных товаров. Наименование товара указано в поле product_name, а прибыль - в sales. Напишем SQL-запрос:</p>
91
<p><a>Ссылка на таблицу</a></p>
91
<p><a>Ссылка на таблицу</a></p>
92
<p>В этом запросе мы произвели агрегацию по товарам и посчитали суммарную прибыль по всем товарам. Мы использовали ORDER BY SUM(sales) DESC, чтобы отсортировать товары по убыванию прибыли. LIMIT 5 позволяет отобрать только пять верхних строк таблицы.</p>
92
<p>В этом запросе мы произвели агрегацию по товарам и посчитали суммарную прибыль по всем товарам. Мы использовали ORDER BY SUM(sales) DESC, чтобы отсортировать товары по убыванию прибыли. LIMIT 5 позволяет отобрать только пять верхних строк таблицы.</p>
93
<p>Так мы нашли топ-5 самых прибыльных товаров. При этом самый удобный и наглядный способ решить нашу задачу - это просто таблица, без построения диаграмм.</p>
93
<p>Так мы нашли топ-5 самых прибыльных товаров. При этом самый удобный и наглядный способ решить нашу задачу - это просто таблица, без построения диаграмм.</p>
94
<h2>Выводы</h2>
94
<h2>Выводы</h2>
95
<p>В этом уроке мы рассмотрели, что такое таблица, какие у нее есть компоненты, и какие существуют отношения между таблицами. Мы поговорили о том, как можно проектировать базы данных. Еще мы агрегировали таблицу продаж и нашли топ-5 самых прибыльных товаров в магазине.</p>
95
<p>В этом уроке мы рассмотрели, что такое таблица, какие у нее есть компоненты, и какие существуют отношения между таблицами. Мы поговорили о том, как можно проектировать базы данных. Еще мы агрегировали таблицу продаж и нашли топ-5 самых прибыльных товаров в магазине.</p>
96
<p>Использование простой таблицы для этой задачи стало лучшим и более наглядным решением, чем построение диаграмм. С помощью знаний о таблицах вы станете лучше понимать, как работают базы данных, и сможете применить эти знания на практике.</p>
96
<p>Использование простой таблицы для этой задачи стало лучшим и более наглядным решением, чем построение диаграмм. С помощью знаний о таблицах вы станете лучше понимать, как работают базы данных, и сможете применить эти знания на практике.</p>