MySql связи таблиц


ArbNet
119

В который раз переделываю работу с базой данных.

Суть вопроса: Есть две таблицы, настроена связь поля одной таблицы к полю другой. Как через запрос к базе данных получить эту связь? Чтобы затем код зная связь сформировал нужный запрос.


edogs software

ArbNet :

В который раз переделываю работу с базой данных.

Суть вопроса: Есть две таблицы, настроена связь поля одной таблицы к полю другой. Как через запрос к базе данных получить эту связь? Чтобы затем код зная связь сформировал нужный запрос.

Если мы правильно поняли Ваш крайне невнятно заданный вопрос, то

show create table blabla_table

и дальше разбирайте получившийся результат и смотрите на связи.

p.s.: Можно достать запросов из  INFORMATION_SCHEMA , но туда доступ не всегда есть.


Sly32

Допустим, есть таблица

CREATE TABLE form (
    id SERIAL NOT NULL,
    name VARCHAR NOT NULL,
    origin_doc_link VARCHAR,
    document_type VARCHAR,
    is_active BOOLEAN,
    fields_config JSON,
    state state,
    created_at TIMESTAMP WITHOUT TIME ZONE,
    updated_at TIMESTAMP WITHOUT TIME ZONE,
    draft BOOLEAN,
    PRIMARY KEY (id),
    UNIQUE (name),
    UNIQUE (origin_doc_link)
);

CREATE TABLE product_type (
id SERIAL NOT NULL,
name VARCHAR,
display_name VARCHAR,
is_default BOOLEAN,
PRIMARY KEY (id)
);

CREATE TABLE form_product_types (
id SERIAL NOT NULL,
form_id INTEGER,
product_type_id INTEGER,
is_checked BOOLEAN,
PRIMARY KEY (id),
FOREIGN KEY(form_id) REFERENCES form (id) ON DELETE CASCADE,
FOREIGN KEY(product_type_id) REFERENCES product_type (id) ON DELETE CASCADE
);


Тебе надо выбрать форму и все продукт тайпы по айди

Тогда это будет примерно так:

SELECT form.name, form.document_type, pt.name, pt.display_name, pt.is_default
FROM form
         JOIN form_product_types as fpt ON form.id = fpt.form_id
         JOIN product_type as pt ON fpt.product_type_id = pt.id
WHERE form.id = 18;

Это крайне примитивный пример,  но приниип такой — джойнишь нужные таблицы и собираешь ответ.

Любая ОРМ это сделает проще и понятнее, но ты же противник)

Такие простые запросы довольно редко встречаются в реальной жизни.


ArbNet

edogs software #:
show create table blabla_table

Спасибо. Я надеялся, что есть ещё какой-то способ получить связи, но видно придётся обрабатывать ответ show create table.


edogs software

ArbNet #:

Спасибо. Я надеялся, что есть ещё какой-то способ получить связи, но видно придётся обрабатывать ответ show create table.

Если есть полный доступ, то лучше брать из  INFORMATION_SCHEMA информацию, просто загляните в табличку, там все очевидно и распарсивать так сильно не надо. show create table может вести себя неадекватно, особенно если это марияДБ


ArbNet

Sly32 #:

Это крайне примитивный пример,  но приниип такой — джойнишь нужные таблицы и собираешь ответ.

Любая ОРМ это сделает проще и понятнее, но ты же противник)

Такие простые запросы довольно редко встречаются в реальной жизни.

Да я знаю. Я мог бы сделать как обычно делается. Но я решил опять продумать всевозможные варианты которые могут быть.

У меня есть узел Сущности. Затем узел Сущности подключает класс нужной сущности и вызывает методы(получить данные, добавить, удалить и тд.). Разработчик может добавлять удалять сущности через контрольную панель, прописывать в структуре команды. Движок наткнувшись на команду получения данных обращается к классу узла Сущности, этот класс подключает класс нужной сущности и вызывается методы получения, добавления, изменения и тд. Получив данные движок может ими заполнить макет(html шаблон компонента)

Данные сущности могут браться из разных таблиц, связи я могу прописывать и в классе, но для целостности данных думаю в самой базе устанавливать связи таблиц и потом двиг эти связи мог определять и формировать нужный запрос.


Sly32

ArbNet #:
Данные сущности могут браться из разных таблиц, связи я могу прописывать и в классе, но для целостности данных думаю в самой базе устанавливать связи таблиц и потом двиг эти связи мог определять и формировать нужный запрос.

Обычно класс — это просто модель таблиц, и если ты точно знаешь что должно быть — надежнее сделать связи в БД. Это и быстрее и проще написать обертку аля ОРМ, которая потом твои сущности будет собирать. При это в некоторых ситуациях это необходимо. Также поможет сократить количество запросов. Но опять же — ты можешь взять ОРМку от того же Ларавел/Симфони и допилить ее под свои нужды. Времени займет меньше, результат будет лучше. 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *