MySQL связать две таблицы
| |
Quad69 | Дата: Вторник, 19 Февраля 2019, 22:42 | Сообщение # 1 |
заслуженный участник
Сейчас нет на сайте
| Всем привет! Подскажите, как связать две таблицы в бд mysql? Если точнее, то нужно что бы при добавлении записи в основную таблицу, она также появлялась в остальных в таблицах с таким же id. Обычно я делал это триггерами, но как я понял это не правильное решение. p.s в вебе я недавно
|
|
| |
DeadDay | Дата: Среда, 20 Февраля 2019, 09:50 | Сообщение # 2 |
New game Studio
Сейчас нет на сайте
| Quad69, Как вариант: Добавляешь запись в основную таблицу. Определяешь последнюю затронутую запись. Т.е. id. Берешь его и добавляешь с этим id новую запись. Но зачем тебе это вообще не пойму. Делаешь просто 2 разных запроса в разные таблицы. Тебе тогда придется как то постоянно знать номера этих id. Либо не делать их автоинкремент.Добавлено (20 Февраля 2019, 09:53) ---------------------------------------------
Код $Insert = $connect_db->prepare("INSERT INTO `таб` (`1`, `2`, `3`) VALUES (:1, :2, :3)"); $params = array(':1' => $1, ':2' => $2, ':3' => $3); $Insert->execute($params); $Id = $connect_db->lastInsertId();
New Games Studio --------------------------------------------------------------------------------------- Проекты: DeadDay - Online --- Мертвый день: Выживание
|
|
| |
drcrack | Дата: Среда, 20 Февраля 2019, 12:21 | Сообщение # 3 |
старожил
Сейчас нет на сайте
| Цитата Обычно я делал это триггерами, но как я понял это не правильное решение. Неправильное решение — это само дублирование в другие таблицы с таким же айди Выбранный метод уже ни на что не повлияет, т.к. у тебя изначально архитектура базы кривая
|
|
| |
Quad69 | Дата: Среда, 20 Февраля 2019, 12:57 | Сообщение # 4 |
заслуженный участник
Сейчас нет на сайте
| Мне надо хранить большое количество данных на одного пользователя, контактные данные, кошельки, баланс и т.д. Можно всё запихнуть в одну таблицу, но так управлять не удобно и вроде для производительности не очень хорошо. Подскажите, как правильно хранить такой объём данных?
|
|
| |
drcrack | Дата: Среда, 20 Февраля 2019, 13:09 | Сообщение # 5 |
старожил
Сейчас нет на сайте
| в главной таблице — только основные данные, которые заполнены всегда и нужны часто опциональные данные, которые могут быть, могут не быть, а еще могут добавляться новые типы по ходу разработки, нужно хранить в отдельной таблице вот примерно такого формата:
id (auto inc, primary key) user_id type (например 0 = телефон, 1 = город, 2 = почтовый адрес и тд) value
т.е. суть в том что у одного юзера в этой таблице может быть несколько записей (или ни одной): | 12981 | 425 | 0 | +71234567891 | 12982 | 425 | 1 | москва | 12983 | 425 | 2 | ул. шарикоподшипниковская дом 1 кв 1
самих таблиц может быть несколько, например одна для контактов, вторая для кошельков, по ситуации
|
|
| |
DeadDay | Дата: Среда, 20 Февраля 2019, 13:15 | Сообщение # 6 |
New game Studio
Сейчас нет на сайте
| Quad69, Я ж тебе написал как это можно сделать!
1. Создаешь нового пользователя.
Код $Insert = $connect_db->prepare("INSERT INTO `user` (`login`, `pass`, `email`) VALUES (:login, :pass, :email)"); $params = array(':login' => $login, ':pass' => $pass, ':email' => $email); $Insert->execute($params);
2. Потом при помощи lastInsertId() определяй последние ID. Почитать про lastInsertId() можно тут.
Код $Id = $connect_db->lastInsertId();
3. У тебя есть $Id. Что тебе теперь мешает добавлять новые данные в другие таблицы?
Код $Insert = $connect_db->prepare("INSERT INTO `bablo` (`user_id`, `money`) VALUES (:user_id, :money)"); $params = array(':user_id' => $user_id, ':money' => $money); $Insert->execute($params);
Где $user_id - это и будет $Id.
- Все это, если тебе нужно за один раз создать много записей для этого пользователя. - А если в разное время, то всегда можно сделать выборку из таблицы с пользователями и взять нужное id пользователя.Добавлено (20 Февраля 2019, 13:20) --------------------------------------------- drcrack,
Код id (auto inc, primary key) user_id type (например 0 = телефон, 1 = город, 2 = почтовый адрес и тд) value
т.е. суть в том что у одного юзера в этой таблице может быть несколько записей (или ни одной): | 12981 | 425 | 0 | +71234567891 | 12982 | 425 | 1 | москва | 12983 | 425 | 2 | ул. шарикоподшипниковская дом 1 кв 1
Так делать тоже не совсем правильно. Если будет много параметров, то лучше все это в одну запись делать.
- Я видел проекты, в таблицах которых доходило до 80 столбцов. И работало все без нарекания.
New Games Studio --------------------------------------------------------------------------------------- Проекты: DeadDay - Online --- Мертвый день: Выживание
|
|
| |
Quad69 | Дата: Среда, 20 Февраля 2019, 13:38 | Сообщение # 7 |
заслуженный участник
Сейчас нет на сайте
| DeadDay, ты имеешь ввиду при добавлении пользователя в основную таблицу, добавлять данные также в остальные? Если да, то чем это отличается от триггеров? А если вдруг, мне понадобиться создать новую таблицу, а в основной уже есть данные, они же не перенесутся.
|
|
| |
DeadDay | Дата: Среда, 20 Февраля 2019, 13:42 | Сообщение # 8 |
New game Studio
Сейчас нет на сайте
| Quad69, а зачем это вообще делать то тебе? Какая вообще задача то?
New Games Studio --------------------------------------------------------------------------------------- Проекты: DeadDay - Online --- Мертвый день: Выживание
|
|
| |
drcrack | Дата: Среда, 20 Февраля 2019, 13:59 | Сообщение # 9 |
старожил
Сейчас нет на сайте
| Цитата Так делать тоже не совсем правильно. Если будет много параметров, то лучше все это в одну запись делать. - Я видел проекты, в таблицах которых доходило до 80 столбцов. И работало все без нарекания. окей, предположим, один из столбцов — ссылка на сайт юзера поступает задача: 1) сделать возможность юзеру добавлять неограниченное количество сайтов у себя в профиле 2) нужна возможность фильтровать юзеров по количеству сайтов, т.е. например выбрать тех у кого указано больше 2 что будешь делать со своей таблицей?
Сообщение отредактировал drcrack - Среда, 20 Февраля 2019, 13:59 |
|
| |
Quad69 | Дата: Среда, 20 Февраля 2019, 14:01 | Сообщение # 10 |
заслуженный участник
Сейчас нет на сайте
| Нужно хранить большое кол-во стобцов, и что бы в будущем при добавлении новых, не возникало особых проблем. Вообще было бы хорошо хранить всё в одной таблице, но не скажется ли это на производительности? Неудобно конечно, но переживу.Добавлено (20 Февраля 2019, 14:34) --------------------------------------------- Хранить в разных таблицах я хотел лишь для удобства, напр в табл. wallets есть 5 колонок: username, qiwi, webmoney, payeer, yamoney, lastchange табл. profile: username, regdate, logindate, comments Вот у этих двух таблиц колонка username должна соответствовать колонке username из табл. accounts(т.е она основная).
Т.е когда добавлялась запись в табл. accounts, автоматически появлялись записи с остальных со значениями по умолчанию. Я раньше это делал через триггеры, но потом понадобилось создать еще одну таблицу с ссылками на соц. сети, а триггеры же работают только при добавлении/удалении, вот пришлось вручную заполнять...
Да и как я потом понял, триггеры не советуют так использовать, но и не хотелось бы размещать в одной таблице по 80 колонок.
Сообщение отредактировал Quad69 - Среда, 20 Февраля 2019, 14:23 |
|
| |
DeadDay | Дата: Среда, 20 Февраля 2019, 14:44 | Сообщение # 11 |
New game Studio
Сейчас нет на сайте
| drcrack, Мне кажется что мы сейчас вообще про разные вещи говорим, не?!
Цитата drcrack ( ) окей, предположим, один из столбцов — ссылка на сайт юзера Ладно. Тогда такой вопрос: - Зачем делать этот столбец, зная что у пользователя будет более одно сайта?
Делается для этого отдельная таблица, в которой хранится список ссылок на сайт id (auto inc, primary key) | user_id | link
И тогда да, это будет правильное решение. Каждая отдельная запись, это и будет его ссылка на сайт.
Цитата drcrack ( ) нужна возможность фильтровать юзеров по количеству сайтов, т.е. например выбрать тех у кого указано больше 2
А собственно в чем проблема то? По такой таблицы проблем не будет ни каких вообще.
Так что я думаю мы говорим про разные вещи.Добавлено (20 Февраля 2019, 14:49) --------------------------------------------- Quad69, Цитата Quad69 ( ) Нужно хранить большое кол-во стобцов, и что бы в будущем при добавлении новых, не возникало особых проблем. Вообще было бы хорошо хранить всё в одной таблице, но не скажется ли это на производительности? Неудобно конечно, но переживу. Все зависит от задачи. В каждой таблице, нужно хранить только те данные для которых она и была создана. - Ты же не будешь хранить в одной таблице к примеру характеристика машин, и характеристики компьютеров. Это разные данные. И по этому разные таблицы.
Цитата Quad69 ( ) Хранить в разных таблицах я хотел лишь для удобства, напр в табл. wallets есть 5 колонок: username, qiwi, webmoney, payeer, yamoney, lastchange табл. profile: username, regdate, logindate, comments Вот у этих двух таблиц колонка username должна соответствовать колонке username из табл. accounts(т.е она основная).
- Хорошо, такая ситуация, когда у пользователя нет ни одного кошелька. Ну вот нет и все. Зачем ты будешь добавлять пустую запись? У одного нет, другого нет. И в итоге полно пустых и бесполезных записей.
- Надо по факту смотреть уже, нужно ли это вообще или нет. По сути, ты, принуждаешь нового пользователя ввести данные кошельков.Добавлено (20 Февраля 2019, 14:52) --------------------------------------------- drcrack, Цитата drcrack ( ) 2) нужна возможность фильтровать юзеров по количеству сайтов, т.е. например выбрать тех у кого указано больше 2 что будешь делать со своей таблицей? А если на то пошло. Можно в таблице пользователя сделать столбец для количества сайтов у него. 1, 4, 70, ....1000. И делай свою фильтрацию, кто опять же мешает?
А таблица самих сайтов может быть вообще не задействована.
New Games Studio --------------------------------------------------------------------------------------- Проекты: DeadDay - Online --- Мертвый день: Выживание
|
|
| |
Quad69 | Дата: Среда, 20 Февраля 2019, 14:57 | Сообщение # 12 |
заслуженный участник
Сейчас нет на сайте
| Цитата DeadDay ( ) По сути, ты, принуждаешь нового пользователя ввести данные кошельков. Ресурс у меня такой, где в профиле пользователя должен быть указан хотя бы 1 кошелек, привязана 1 соц.сеть и т.д. Пустые строки конечно же будут, но они же ведь ничего не занимают?
|
|
| |
DeadDay | Дата: Среда, 20 Февраля 2019, 15:03 | Сообщение # 13 |
New game Studio
Сейчас нет на сайте
| Цитата Quad69 ( ) Ресурс у меня такой, где в профиле пользователя должен быть указан хотя бы 1 кошелек, привязана 1 соц.сеть и т.д. Тогда лучше как я писал выше. А потом при необходимости, апгрейдить нужные кошельки.
Цитата Quad69 ( ) Пустые строки конечно же будут, но они же ведь ничего не занимают? Не будут. Но зачем они? У тебя будет 1000 записей. А с данными только 50. Опять же к примеру.
Делай, так как считаешь для себя удобнее. В дальнейшем придет осознание как это работает. Конкретно твоя задача. И из полученных данных, ты уже сможешь проанализировать. Подходит данное решение или нет.
New Games Studio --------------------------------------------------------------------------------------- Проекты: DeadDay - Online --- Мертвый день: Выживание
|
|
| |
drcrack | Дата: Среда, 20 Февраля 2019, 16:06 | Сообщение # 14 |
старожил
Сейчас нет на сайте
| Цитата Ладно. Тогда такой вопрос: - Зачем делать этот столбец, зная что у пользователя будет более одно сайта? ну вот когда начинали был один, а сегодня понадобилось больше одного ты как будто никогда реальных проектов не видел
Цитата А собственно в чем проблема то? проблема в том, что у тебя уже в продакшене работает одна огромная таблица с 80 полями и весь код заточен под эту архитектуру
Цитата Делается для этого отдельная таблица, в которой хранится список ссылок на сайт id (auto inc, primary key) | user_id | link ну вот одну таблицу сделал, потом еще одну для дополнительных емейлов, потом еще одну для чего-то, и еще 20 таблиц для разных сущностей
ты уверен что это лучше чем 1 таблица и 1 класс в котором инкапсулирована вся логика работы с метаданными?
Цитата А если на то пошло. Можно в таблице пользователя сделать столбец для количества сайтов у него. 1, 4, 70, ....1000. И делай свою фильтрацию, кто опять же мешает? и вот твоя база кроме того что была кривая, стала вдобавок денормализованной за что тебе конечно большое спасибо скажут все кто будет поддерживать эту архитектуру после тебя
Сообщение отредактировал drcrack - Среда, 20 Февраля 2019, 16:09 |
|
| |
DeadDay | Дата: Среда, 20 Февраля 2019, 18:24 | Сообщение # 15 |
New game Studio
Сейчас нет на сайте
| Цитата drcrack ( ) ну вот когда начинали был один, а сегодня понадобилось больше одного ты как будто никогда реальных проектов не видел Ну вот судя по прочитанному, это получается вы их не видели. И дальнозоркостью вы не блещете. Если не можете заранее предвидеть такую ситуацию.
Цитата drcrack ( ) проблема в том, что у тебя уже в продакшене работает одна огромная таблица с 80 полями и весь код заточен под эту архитектуру А от куда ты взял число 80? Я написал, что видел проекты, в которых присутствовали БД с таблицами такого массива. Вас это удивляет? И что, то что уже в продакшене ни как нельзя изменять, править и добавлять что ни чего? Или Ты для одно изменение в БД будешь делать новый проект что ль? Че говоришь то???!!!
Цитата drcrack ( ) для дополнительных емейлов Хахаааххх. Это реально было смешно....не серьезно.
Цитата drcrack ( ) и вот твоя база кроме того что была кривая, стала вдобавок денормализованной А где ты увидел МОЮ то БД? Читай хоть внимательно.
Цитата drcrack ( ) за что тебе конечно большое спасибо скажут все кто будет поддерживать эту архитектуру после тебя
Чувак, давай закроем тему?! Ну серьезно.Добавлено (20 Февраля 2019, 18:26) --------------------------------------------- Человек спросил что и как. Я ему ответил. А утроило его это или нет?! Это уже другой вопрос. Добавлено (20 Февраля 2019, 18:42) ---------------------------------------------
Да..да..да... Я тя умоляю. Я аж задрожал. Аж -5 в репу..... Да ты крут. Добавлено (20 Февраля 2019, 18:43) --------------------------------------------- Ой, да ты ж еще и "сторожил". Ох наверное бан теперь....
New Games Studio --------------------------------------------------------------------------------------- Проекты: DeadDay - Online --- Мертвый день: Выживание
|
|
| |
|