
Chopko
15.11.2017
19:03:04
i have row "user" in table group
"user" have array value = "['1', '55' , '199']"
have get all group where in array "55"?

Yaroslav
15.11.2017
19:08:48
where user = 55

Chopko
15.11.2017
19:12:56
user = "['1', '55' , '199']"
или
"['55', '234' , '4577']"

Google

Chopko
15.11.2017
19:13:52
нужно найти все где есть в масиве 55

Yaroslav
15.11.2017
19:14:32
where user like '%55%'

Chopko
15.11.2017
19:56:48
а если будет 555
или 1055

Yaroslav
15.11.2017
20:11:44
найдет все, где есть 55

Chopko
15.11.2017
20:15:55
спс

Nazary
16.11.2017
14:41:46
Не добавить ограничения внешнего ключа, выдаёт ошибку #1215 - Cannot add foreign key constraint.
Типы полей полностью одинаковые, перепроверил 100 раз.
Внешних же ключей может быть несколько? Просто в таблицах, где хочу ещё по одному добавить, уже есть один внешний по каждому.

Alexey
16.11.2017
14:47:35
причин для этой ошибки может быть много. причину нужно смотреть так:
mysql> pager grep -A 5 FOREIGN
mysql> show engine innodb status;

Yaroslav
16.11.2017
14:51:34
данные правильные?


Dzmitry
16.11.2017
15:50:02
встал вопрос. Как хранить древовидную информацию в базах данных?(простейщий xml, json или любой другой формат)
Например данные типа:
- Persons:
- - id: 1
- - name: "John:
- - Age: 26
- - Car: 1
- Cars:
- - id: 1
- - type: "audi a4"
Собственно должно быть не две таблицы Persons и Cars, а что-то совсем другое, так как данные могут быть другие, и структура другая.
Первое что мне пришло в голову это следующие таблицы:
Таблица types(id, type_name)
Таблица values(id, type_id, value_id)
несколько таблиц для типов:
Таблица int_values(value_id, value)
Таблица string_values(value_id, value)
Таблица array_values(value_id, value varchar)
и из таблицы array_values из строки извлекаются все внутренние ветки дерева. Но мне что-то подсказывает, что такой способ будет не оптимальным, когда начнется выполнение select/update из приложения. Возможно, нужно будет написать процедур в бд, но пока вопрос не в этом - есть ли способ лучше организовать структуру данных в этом случае?

Google

Yaroslav
16.11.2017
15:51:26
nosql почитай


Nazary
16.11.2017
15:54:51
встал вопрос. Как хранить древовидную информацию в базах данных?(простейщий xml, json или любой другой формат)
Например данные типа:
- Persons:
- - id: 1
- - name: "John:
- - Age: 26
- - Car: 1
- Cars:
- - id: 1
- - type: "audi a4"
Собственно должно быть не две таблицы Persons и Cars, а что-то совсем другое, так как данные могут быть другие, и структура другая.
Первое что мне пришло в голову это следующие таблицы:
Таблица types(id, type_name)
Таблица values(id, type_id, value_id)
несколько таблиц для типов:
Таблица int_values(value_id, value)
Таблица string_values(value_id, value)
Таблица array_values(value_id, value varchar)
и из таблицы array_values из строки извлекаются все внутренние ветки дерева. Но мне что-то подсказывает, что такой способ будет не оптимальным, когда начнется выполнение select/update из приложения. Возможно, нужно будет написать процедур в бд, но пока вопрос не в этом - есть ли способ лучше организовать структуру данных в этом случае?
Можно работать отдельно с типами в коде, а в базе хранить текстовый.


lost
16.11.2017
15:56:29
как варик, если так уже хочется в mysql - можно почитать интересную статью uber как они schemaless поверх мускуля готовят

Pavel
16.11.2017
15:58:37
А какие способы вы уже рассматривали и какие отвергли и почему? json, nested set, materialized path, etc ?

Dzmitry
16.11.2017
16:07:44
Вообще все начинается с того, что существует система мерчендайзинга (сервер+мобильная часть). Система огромна. Она поставляется для нескольких компаний. У каждой компании есть свои требования, и мне, как программисту, пришлось клонировать систему для каждой компании и в каждом клоне дописывать условный код и схему бд. Собственно если бы часть условной логики можно было бы перенести в бд... и для того чтобы условия можно было применять к любым типам данных, данные нужно декомпозировать в простейшие единицы.
Не знаю, может это вовсе бред?))

Yaroslav
16.11.2017
16:19:06

Pavel
16.11.2017
16:23:02
А может просто нужно БД нормально спроектировать, со всеми таблицами, внешними ключами и констрейнтами? )
В общем твой вопрос слишком абстрактный, этим и занимаются архитекторы впринципе. На фуллтайме сидят и рассматривают разные кейсы, беседуют с БА, смотрят, замеры делают.

Dzmitry
16.11.2017
16:27:55
Выкладки, статьи, книги... что угодно)

lost
16.11.2017
16:30:41
у тебя же есть ряд требований к системе, начни с анализа требований

Pavel
16.11.2017
16:32:16
Выкладки, статьи, книги... что угодно)
Затрудняюсь, единственное, насколько я смог понять из объясненей, это не обычный кейс хранения деревьев (типа nested set/adj list) а все же больше случай именно данных с динамической схемой. Значит скорее всего JSON

Dzmitry
16.11.2017
16:37:18
Хорошо, буду копаться, спасибо.

Nazary
16.11.2017
18:30:49
Короче, пересоздал поля по собственноручному запросу, всё пошло, как нужно без ошибок.

Alexey
16.11.2017
18:48:26
тут нужно было внимательно посмотреть на: 1. типы данных в создаваемой и referenced таблицах. 2. индексах в referenced таблице и 3. default collation
раз всё решилось после пересоздания поля, вангую, что поменялась default collation

Nazary
16.11.2017
18:52:14

Google

Yaroslav
16.11.2017
18:59:58
данные были, до пересоздания?

lost
16.11.2017
19:01:34

Nazary
16.11.2017
19:03:13

Сергей
17.11.2017
12:49:47
ДОбрый день!
Реально ли сделать такой финт на уровне MySQL.
При удалении записи в таблице A удалять все записи в таблице Б, где Б.object_id = A.id and Б.object_type = "А" ?

Сергей
17.11.2017
12:58:05

Сергей
17.11.2017
12:58:24
Пока пришел к тригерам...

Сергей
17.11.2017
12:58:44
вот для примера
CREATE TABLE `reports` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`reportid` int(11) DEFAULT NULL,
`clientcode` int(11) NOT NULL,
`client_id` varchar(50) DEFAULT NULL,
`datedeliveri` datetime DEFAULT NULL,
`status` varchar(50) DEFAULT NULL,
`plateg` varchar(50) DEFAULT NULL,
`priceuslug` varchar(50) DEFAULT NULL,
`ds` varchar(3) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `reportid` (`reportid`),
CONSTRAINT `reports_ibfk_1` FOREIGN KEY (`reportid`) REFERENCES `report` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=371 DEFAULT CHARSET=utf8

Сергей
17.11.2017
12:59:08
Б.object_id = A.id and Б.object_type = "А"
такой финт FK не сделаешь

Сергей
17.11.2017
13:00:34
CREATE TABLE `report` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`companycode` int(11) NOT NULL,
`ldtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `companycode` (`companycode`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8
вот если из этой таблицы удалить запись, то в таблице выше удалятся все записи с данным id

Сергей
17.11.2017
13:00:55
Это не то
У меня два столбца, а не один с ID

Сергей
17.11.2017
13:01:38
и?

Сергей
17.11.2017
13:03:10
ну и как сделать FK??
При удалении записи в таблице A удалять все записи в таблице Б, где Б.object_id = A.id and Б.object_type = "А" ?

Сергей
17.11.2017
13:04:00
хочешь удалять только из столбца?

Сергей
17.11.2017
13:05:42
хочу удалять все строки в таблице Б, где Б.object_id = A.id and Б.object_type = "A"

lost
17.11.2017
13:29:19
можешь сделать составной FK, правда для этого необходимо будет, чтобы этот дополнительный атрибут был в обеих таблицах
ну или через триггеры, только не забудь, что на каскадных удалениях на дочерних таблицах они не срабатывают
ну и крайний вариант, напиши хранимку

Сергей
17.11.2017
13:41:34

Google

Nazary
17.11.2017
15:32:42
Сталкиваюсь с ошибкой 1452, если пишу просто запрос.
Если до и после него поставить SET FOREIGN_KEY_CHECKS, то всё ок, просто первый и третий никак по времени не влияет, если верить отчёту после выполнения запросов.
SET FOREIGN_KEY_CHECKS=0;
INSERT INTO kuku(id, a, b, c, d) VALUES (1,2,3,4,5);
SET FOREIGN_KEY_CHECKS=1;
Как избавиться от этого? 1452 — это про внешние ключи. Да, они у меня есть. Всегда такой костыль нужен?

lost
17.11.2017
15:43:22
Может просто в родительскую таблицу сначала добавить значение а не страдать такой херней?

Nazary
17.11.2017
15:45:28

Yaroslav
17.11.2017
15:45:37
забей

lost
17.11.2017
15:45:52
Ок

Nazary
17.11.2017
15:46:26

Yaroslav
17.11.2017
15:47:28
какой запрос делаешь
какие данные в бд
на момент запроса, пусто?
какие типы колонок, обе колонки правильно написаны?
бд на которую ссылаеться существует?
у тебя явно какая-то синтаксическая ошибка
проверь все вышесказанное
данные которые вставляються по ключу, должны быть и в родители, это так?
поле на которое ссылаешься primary key?
скинь запрос на создание таблиц
с ключами
на какой ключ ругается?

Google

Yaroslav
17.11.2017
15:54:38
у тебя поле telegram_id ссылаеться на 5 таблиц с таким полем
это законно?
во всех 5 таблицах, есть значение которое ты вставляешь?
почитай про foreign ключи
тебе нужно ключи с этой таблицы распихать на 5 таблиц
по 1
CONSTRAINT accounts_ibfk_1 FOREIGN KEY (telegram_id) REFERENCES accounts (telegram_id) ON DELETE CASCADE ON UPDATE CASCADE, - этот в request и т.д.
и если ты задал для таблицы, то для полей не надо
CHARSET=latin1 COLLATE=latin1_bin