Добрый день. Тема про базы данных простыми словами
Когда работал формулами или в PQ, то часто суть работы сводилось к сборке с нескольких таблиц, источников в одну таблицу. Когда коснулась тема базы данных, то вижу обратную картину: таблицу, в которой все собрано, разбивают на несколько таблиц и тем самым уменьшают количество повторений информации. Связь между таблицами держат отношениями(связями). Причем, глядя как связывают таблицы в PP и PB, мне была понятен принцип связывания: как в PQ Join - одно поле к другому. Только в PP связь по одному полю. Кстати, возможно ли связывать в базах данных по двум полям таблиц? В базах данных же, после разбивки на несколько таблиц, связывают по ключу (поле типа индекса) и полю значений и это работает. Но мне не понятно почему? Например, в этой теме Андрей VG предложил базу данных. Таблица Типы категорий связана с таблицей Врачи одноименными полями Код_категории. Но в одной таблице это поле индекса, а в другой это поле с текстовыми значениями. Почему это работает?
Сразу еще вопрос по той же базе. Таблицы Заказы и Детали_заказов связаны. В таблице Детали_заказов значения поля Код_заказа не уникальны. Правильно ли я понимаю что значения этого поля не формируются автоматом? Эти значения надо подготавливать отдельно до загрузки, например, в PQ(группировкой и индексом)? Загрузку собираюсь заносить не по одной строке, а сразу несколько или добавлять или переписывать
Кстати, возможно ли связывать в базах данных по двум полям таблиц? Отвечу сам. Можно сделать в нужных таблицах составной ключ. Правда, советуют не увлекаться.
Михаил Л, 1. в базах ключ как правило уникален в справочнике и однозначно определяет элемент, что не только сокращает объем данных, но исключает появление "однофамильцев" которые друг на друга завязаны.. 2. Как правило ключ индексируется, что в последствии ускоряет работу и облегчает жизнь серверу 3. Связь по нескольким полям - а почему нет? Если это разные сущности, например нужно кроме ограниченного списка объектов выбрать те, которые соответствуют определенным датам из списка и даты уникальны для каждого объекта . Объект нужно связывать по ключу. а даты дополнительно. ( ну это я фантазирую для примера)
БМВ написал: 1. в базах ключ как правило уникален в справочнике и однозначно определяет элемент, что не только сокращает объем данных, но исключает появление "однофамильцев" которые друг на друга завязаны.. 2. Как правило ключ индексируется, что в последствии ускоряет работу и облегчает жизнь серверу
Значит, даже если уверен что значения поля для ключа будут уникальны, для пользы дела лучше добавить счетчик индекса. Потом спасибо скажут)
Цитата
БМВ написал: Объект нужно связывать по ключу. а даты дополнительно
А как это? Два раза связать? Составной ключ из текста и даты, я так понимаю, не сделать.
Добрый день, Михаилы! Очень упрощенно. SQL-базы теоретически могут работать вообще без индексов (ключей). Связь между таблицами задается в предикатах SQL-запросов. Если к таблице, участвующей в запросе, добавляется индекс (или удаляется индекс), то результат SQL запроса не должен измениться (при условии, конечно, что добавление уникального индекса не вызвало исключительную ситуацию). Другое дело, что без индексов многие SQL-запросы будут иметь неэффективный план выполнения. Кроме того, наличие уникальных индексов естественным образом ограничивает ввод данных в эту таблицу. Иногда еще (далеко не всегда) используют внешниеключи опять же для ограничения корректировки данных и "подсказок" компилятору SQL-запросов.
Индекс в "развитых" SQL-базах может состоять из нескольких полей, использовать функции и прочие извращения; может быть уникальным или не уникальным. Одна таблица может иметь несколько индексов (а может и не иметь). Иногда, один из уникальных индексов объявляется первичным (Primary Key).
sokol92 написал: используют внешние ключи опять же для ограничения корректировки данных и "подсказок" компилятору SQL-запросов
Внешний ключ, я так понял, все таки надо подготавливать перед загрузкой для каждой строки соответствующий. Я то думал может можно в базе данных как то группировать и назначать этот внешний ключ. Вообщем, проясняется) И это
Цитата
Михаил Л написал: в одной таблице это поле индекса, а в другой это поле с текстовыми значениями
Можно объяснить так: если в таблице только два поля - Ключевое поле и поле с уникальными значениями, то нет разницы какое поле использовать для связи. Или так неверно считать? Если для связи вместо поля Код_категории назначу поле Наименование категории, изменится ли отношение этих таблиц? Результат джойна будет тот же?
Внешние ключи - это специальный механизм, применяемый при описании таблиц - почитайте.
Связь между таблицами задается в SQL запросе - и это может быть не только равенство полей (одного или нескольких). Например, у Вас есть таблица сотрудников с полями: табельный номер, ФИО, СНИЛС, дата рождения. Вы можете эту таблицу в запросе связать с другой таблицей по табельному номеру (он, как правило, уникален), можете по СНИЛС (если он есть во второй таблице), можете по дате рождения и по совпадению ФИО в верхнем (или нижнем) регистре (используя функцию SQL UPPER). Разные запросы могут использовать разные методы соединения таблиц. Можно сохранить "полезный" запрос в базе данных - хранимое представление (VIEW).