HTML Diff
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>