Суббота, 30 Марта 2024, 11:01

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Форум игроделов » Программирование » Скриптовые языки программирования » MySQL связать две таблицы
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 класс в котором инкапсулирована вся логика работы с метаданными? :D

Цитата
А если на то пошло. Можно в таблице пользователя сделать столбец для количества сайтов у него. 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
--- Мертвый день: Выживание
Форум игроделов » Программирование » Скриптовые языки программирования » MySQL связать две таблицы
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг