| 
	
		
		
			| 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
 --- Мертвый день: Выживание
 |  |  |  |  |  
 |