Сложная БД (связанные таблицы)
- Остап
- Автор темы
- Не в сети
- Осваиваюсь на форуме
-
- Сообщений: 11
- Спасибо получено: 0
Около недели изучаю Siblod, прочитал шикарные уроки Wedal ( wedal.ru/seblod.html ) и понял, что основная философия построения баз данных в Seblod основана на т.н. «Типах контента». Для меня, который эпизодически создаёт БД в той же системе Access – это непривычно.
Скажем, в Access при необходимости создания БД «Гражданин-Недвижимость» (отношение ОДИН – МНОГО) необходимо проектировать ДВЕ таблицы и связывать их по id-полям. В Seblod для этого предусмотрен тип данных Group X, при этом физически Siblod «запихивает» несколько полей в одно физическое поле БД. (Кстати, у меня получилось организовать форму ввода данных, но так и не получилось всё это вывести).
А если необходимо сделать БД с отношением МНОГО-МНОГО, например БД «Сотрудник-Клиент»? В Access для этого создаётся промежуточная таблица, в которой есть поля idСотрудник и idКлиент и связь таблицы «Сотрудники» и таблицей «Клиенты» происходит через эту промежуточную таблицу. Как это делается в Seblod мне вообще не понятно.
Насколько я понял, Seblod всё-же даёт возможность проектировать базы данных классическим способом (в т.ч. с ручными манипуляциями в phpMyAdmin). Если это так, я был бы очень благодарен, если бы мастодонт Seblod прописал бы небольшой урок на эту тему.
Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.
- Wedal
-
- Не в сети
- Администратор
-
- Сообщений: 2869
- Спасибо получено: 659
Например, у вас есть магазин, в котором есть товары и цены. При этом один товар может иметь несколько цен. Товары хранятся в одной таблице БД, а цены в другой. При этом в таблице с ценами для каждой цены проставляется ID товара. Т.е. если у товара 3 цены, в таблице цен будет 3 записи для этого товара. В Access вы вручную настраиваете "Связи" и можете при выборе товара видеть его цены. В SQL вы должны выполнить SQL-запрос вроде: "Выбери мне товар с заданным ID из таблицы товаров" и запрос "Выбери мне цены с заданным ID товара из таблицы цен" (в реальности делают все это в одном запросе, но для упрощения я пишу так). В результате выполнения этого запроса вы получаете информацию о товаре и его цены, которые остается вывести в web-интерфейсе. Вот так это можно представить упрощенно в аналогии со "связями" в Access.
Теперь к SEBLOD.
Когда вы используете FieldX или GroupX, то вы не создаете 2 таблицы. Используя наш пример, вы создаете одну таблицу, в одной из колонок которой хранятся записи в формате JSON, т.е. другая таблица, преобразованная в строку. Такой подход использовать можно, и иногда он оправдан, но не всегда.
Если вам нужны сложные связи в SEBLOD, то в вашем примере вы должны создать «Сотрудник-Клиент» вы должны создать:
1) Тип контента "Сотрудники" - таблица в БД, куда будут добавляться сотрудники и их данные
2) Тип контента "Клиенты" - таблица в БД, куда будут добавляться клиенты и их данные
3) Тип контента "Взаимодействия (или связи)" -таблица в БД, куда будут добавляться связи между сотрудниками и клиентами
Далее будет примерно как в Access, в первом типе контента заводите сотрудников, во втором клиентов, в третьем их взаимодействия, а далее через типы поиска можно будет получать данные по каждому из типов контента, либо, используя дополнительные плагины или прямые SQL-запросы, данные в совокупности из всех типов контента.
В завершении добавлю, что задачка, на которую вы нацелились, довольно сложная и требует хороших навыков веб-разработки. Не имея хотя бы базового опыта работы с PHP и SQL, реализовать ее будет проблематично.
Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.
- Остап
- Автор темы
- Не в сети
- Осваиваюсь на форуме
-
- Сообщений: 11
- Спасибо получено: 0
SQL-запросы не проблема. Вы только подскажите где их размещать?
Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.
- Wedal
-
- Не в сети
- Администратор
-
- Сообщений: 2869
- Спасибо получено: 659
В нем рассказывается о том, как связать 2 типа контента без программирования вообще.
По SQL: это сильно зависит от задачи.
Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.
- Остап
- Автор темы
- Не в сети
- Осваиваюсь на форуме
-
- Сообщений: 11
- Спасибо получено: 0
Задачка на которую я нацелился совсем не та, что я описал. Но в этой задаче необходимо связать две таблицы (соотношение МНОГИЕ-МНОГИЕ) и я пытаюсь понять как это сделать. Сейчас пытаюсь отработать элементарные модели.Wedal пишет: В завершении добавлю, что задачка, на которую вы нацелились, довольно сложная и требует хороших навыков веб-разработки. Не имея хотя бы базового опыта работы с PHP и SQL, реализовать ее будет проблематично.
Проблем с SQL-запросами у меня нет. С PHP чуть сложнее, но можно подтянуть.
То, что в Видео, честно-говоря меня не совсем устраивает.
Вопрос: ГДЕ записывать SQL-запрос, связывающий таблицы? (Я не спрашиваю сам запрос, это мне понятно).
Буду очень благодарен за ответ!
Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.
- Wedal
-
- Не в сети
- Администратор
-
- Сообщений: 2869
- Спасибо получено: 659
Вы можете написать запрос в поле SEBLOD Select Dynamic
Вы можете написать запрос в поле SEBLOD Core 42
Вы можете написать запрос в одном из переопределенных макетов шаблона SEBLOD.
Опять же, видимо вы не поняли то, что я писал в первом ответе. Таблицы не связываются между собой как вы привыкли видеть в Access. SQL запрос позволяет лишь выбрать данные из нескольких таблиц, объединив эти таблицы "на лету". Почитайте про SQL JOIN. Т.е. нельзя сделать один запрос, чтобы в дальнейшем при заполнении форм данные раскидывались по таблицам сами собой, благодаря заранее установленным связям. Для этого и нужно PHP. В нем вы проектируете логику работы с формой, в том числе и сохранение данных в таблицах БД.
Если вернуться к примеру с товаром и ценами: вы заполнили товар и нажали кнопку сохранить. Сначала в PHP-скрипте срабатывает SQL-запрос на сохранения товара в таблицу товаров. Далее вы определяется ID сохраненного товара и срабатывает другой SQL-запрос на сохранение цен товара в таблицу цен. Поскольку цен у вас несколько (ну например), то в таблицу цен будет добавлено несколько записей. Простейший вариант осуществления: цикл в PHP, который перебирает все цены и для каждой отправляет SQL-запрос на добавление в таблицу цен, помещая также ID товара, которому принадлежит цена в отдельный столбец.
Но что-то мы уходим от SEBLOD. Цель CCK - избавить вас от прямой работы с PHP и SQL. Пытайтесь решить задачу средствами SEBLOD, а не написанием прямых запросов.
Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.
- Остап
- Автор темы
- Не в сети
- Осваиваюсь на форуме
-
- Сообщений: 11
- Спасибо получено: 0
Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.
- Остап
- Автор темы
- Не в сети
- Осваиваюсь на форуме
-
- Сообщений: 11
- Спасибо получено: 0
www.seblod.com/store/extensions/922
Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.
- Остап
- Автор темы
- Не в сети
- Осваиваюсь на форуме
-
- Сообщений: 11
- Спасибо получено: 0
Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.
- Errikos
-
- Не в сети
- Осваиваюсь на форуме
-
- Сообщений: 25
- Спасибо получено: 0
Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.
- Остап
- Автор темы
- Не в сети
- Осваиваюсь на форуме
-
- Сообщений: 11
- Спасибо получено: 0
Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.
- Errikos
-
- Не в сети
- Осваиваюсь на форуме
-
- Сообщений: 25
- Спасибо получено: 0
Спасибо..
Пожалуйста Войти или Зарегистрируйтесь, чтобы присоединиться к беседе.