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