Сложная БД (связанные таблицы)

1 год 7 мес. назад #7701 от Остап
Добрый день. Возникла необходимость создания хорошей многопользовательской БД на базе WEB-интерфейса. Поскольку я уже с 2008 года эпизодически создавал сайты на Joomla то занялся поиском необходимого компонента. Коллега по форуму подсказал смотреть в сторону Siblod и я ему за это очень благодарен.
Около недели изучаю Siblod, прочитал шикарные уроки Wedal ( wedal.ru/seblod.html ) и понял, что основная философия построения баз данных в Seblod основана на т.н. «Типах контента». Для меня, который эпизодически создаёт БД в той же системе Access – это непривычно.
Скажем, в Access при необходимости создания БД «Гражданин-Недвижимость» (отношение ОДИН – МНОГО) необходимо проектировать ДВЕ таблицы и связывать их по id-полям. В Seblod для этого предусмотрен тип данных Group X, при этом физически Siblod «запихивает» несколько полей в одно физическое поле БД. (Кстати, у меня получилось организовать форму ввода данных, но так и не получилось всё это вывести).
А если необходимо сделать БД с отношением МНОГО-МНОГО, например БД «Сотрудник-Клиент»? В Access для этого создаётся промежуточная таблица, в которой есть поля idСотрудник и idКлиент и связь таблицы «Сотрудники» и таблицей «Клиенты» происходит через эту промежуточную таблицу. Как это делается в Seblod мне вообще не понятно.
Насколько я понял, Seblod всё-же даёт возможность проектировать базы данных классическим способом (в т.ч. с ручными манипуляциями в phpMyAdmin). Если это так, я был бы очень благодарен, если бы мастодонт Seblod прописал бы небольшой урок на эту тему.

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

1 год 7 мес. назад #7705 от Wedal
Остап, вам нужно для начала немного переключить сознание с СУБД Access, на СУБД на основе SQL. То, что в Access вы называете "Связи", в SQL реализуется с помощью SQL-запросов и программирования интерфейса взаимодействия.
Например, у вас есть магазин, в котором есть товары и цены. При этом один товар может иметь несколько цен. Товары хранятся в одной таблице БД, а цены в другой. При этом в таблице с ценами для каждой цены проставляется ID товара. Т.е. если у товара 3 цены, в таблице цен будет 3 записи для этого товара. В Access вы вручную настраиваете "Связи" и можете при выборе товара видеть его цены. В SQL вы должны выполнить SQL-запрос вроде: "Выбери мне товар с заданным ID из таблицы товаров" и запрос "Выбери мне цены с заданным ID товара из таблицы цен" (в реальности делают все это в одном запросе, но для упрощения я пишу так). В результате выполнения этого запроса вы получаете информацию о товаре и его цены, которые остается вывести в web-интерфейсе. Вот так это можно представить упрощенно в аналогии со "связями" в Access.

Теперь к SEBLOD.
Когда вы используете FieldX или GroupX, то вы не создаете 2 таблицы. Используя наш пример, вы создаете одну таблицу, в одной из колонок которой хранятся записи в формате JSON, т.е. другая таблица, преобразованная в строку. Такой подход использовать можно, и иногда он оправдан, но не всегда.

Если вам нужны сложные связи в SEBLOD, то в вашем примере вы должны создать «Сотрудник-Клиент» вы должны создать:
1) Тип контента "Сотрудники" - таблица в БД, куда будут добавляться сотрудники и их данные
2) Тип контента "Клиенты" - таблица в БД, куда будут добавляться клиенты и их данные
3) Тип контента "Взаимодействия (или связи)" -таблица в БД, куда будут добавляться связи между сотрудниками и клиентами
Далее будет примерно как в Access, в первом типе контента заводите сотрудников, во втором клиентов, в третьем их взаимодействия, а далее через типы поиска можно будет получать данные по каждому из типов контента, либо, используя дополнительные плагины или прямые SQL-запросы, данные в совокупности из всех типов контента.

В завершении добавлю, что задачка, на которую вы нацелились, довольно сложная и требует хороших навыков веб-разработки. Не имея хотя бы базового опыта работы с PHP и SQL, реализовать ее будет проблематично.
Спасибо сказали: Остап

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

1 год 7 мес. назад #7706 от Остап
Спасибо за развёрнутый ответ.
SQL-запросы не проблема. Вы только подскажите где их размещать?

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

1 год 7 мес. назад - 1 год 7 мес. назад #7707 от Wedal
Остап, я тут подумал, посмотрите еще вот это видео:

В нем рассказывается о том, как связать 2 типа контента без программирования вообще.
По SQL: это сильно зависит от задачи.

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

1 год 7 мес. назад #7713 от Остап

Wedal пишет: В завершении добавлю, что задачка, на которую вы нацелились, довольно сложная и требует хороших навыков веб-разработки. Не имея хотя бы базового опыта работы с PHP и SQL, реализовать ее будет проблематично.

Задачка на которую я нацелился совсем не та, что я описал. Но в этой задаче необходимо связать две таблицы (соотношение МНОГИЕ-МНОГИЕ) и я пытаюсь понять как это сделать. Сейчас пытаюсь отработать элементарные модели.
Проблем с SQL-запросами у меня нет. С PHP чуть сложнее, но можно подтянуть.
То, что в Видео, честно-говоря меня не совсем устраивает.
Вопрос: ГДЕ записывать SQL-запрос, связывающий таблицы? (Я не спрашиваю сам запрос, это мне понятно).
Буду очень благодарен за ответ!

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

1 год 7 мес. назад - 1 год 7 мес. назад #7716 от Wedal
Остап, нельзя ответить на ваш вопрос однозначно, поскольку в SEBLOD есть несколько мест, куда вы можете написать запрос. Каждое из них подойдет для определенной задачи, какая задача у вас я не знаю.

Вы можете написать запрос в поле SEBLOD Select Dynamic
Вы можете написать запрос в поле SEBLOD Core 42
Вы можете написать запрос в одном из переопределенных макетов шаблона SEBLOD.

Опять же, видимо вы не поняли то, что я писал в первом ответе. Таблицы не связываются между собой как вы привыкли видеть в Access. SQL запрос позволяет лишь выбрать данные из нескольких таблиц, объединив эти таблицы "на лету". Почитайте про SQL JOIN. Т.е. нельзя сделать один запрос, чтобы в дальнейшем при заполнении форм данные раскидывались по таблицам сами собой, благодаря заранее установленным связям. Для этого и нужно PHP. В нем вы проектируете логику работы с формой, в том числе и сохранение данных в таблицах БД.
Если вернуться к примеру с товаром и ценами: вы заполнили товар и нажали кнопку сохранить. Сначала в PHP-скрипте срабатывает SQL-запрос на сохранения товара в таблицу товаров. Далее вы определяется ID сохраненного товара и срабатывает другой SQL-запрос на сохранение цен товара в таблицу цен. Поскольку цен у вас несколько (ну например), то в таблицу цен будет добавлено несколько записей. Простейший вариант осуществления: цикл в PHP, который перебирает все цены и для каждой отправляет SQL-запрос на добавление в таблицу цен, помещая также ID товара, которому принадлежит цена в отдельный столбец.

Но что-то мы уходим от SEBLOD. Цель CCK - избавить вас от прямой работы с PHP и SQL. Пытайтесь решить задачу средствами SEBLOD, а не написанием прямых запросов.

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

1 год 7 мес. назад #7717 от Остап
Хорошо, я понял суть. Спасибо.

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

1 год 7 мес. назад #7718 от Остап
Думаю может помочь это:
www.seblod.com/store/extensions/922

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

1 год 7 мес. назад - 1 год 7 мес. назад #7746 от Остап
В предложенном Вами учебном ролике (4:50) в колонке ""Live" устанавливается значение "var". Может подскажете, что делать в нынешней версии? (Такого значения нет)

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

1 год 7 мес. назад #7748 от Errikos
все нормально работает
Вложения:

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

1 год 7 мес. назад #7749 от Остап
Понял, Спасибо.

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.

11 мес. 2 нед. назад - 11 мес. 2 нед. назад #8188 от Errikos
в вышеуказанном видео можно связать 2 типа контента.Да, все работает правильно,но только когда в Storage: Format / Object - standard - article, а как быть когда в Storage: Format / Object - standard - Free
Спасибо..

Пожалуйста Войдите или Зарегистрируйтесь, чтобы присоединиться к беседе.


Вверх