[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вопрос про реляционные БД
maximka787
Привет всем. Меня давно мучает вопрос по поводу реляционных БД. Хотел поинтересоваться, как вы реализуете добавление данных с одним ключом в разные таблицы, для кого-то это может и пустяк, но для меня это давно вопрос.
Есть, например 3 таблицы.
userid, name, password, email...;
id_tab1, userid, text1, text2;
id_tab2, userid, text1, text2;

userid - это порядковый номер клиентов, а также ключ в остальных таблицах. А вот мой механизм:
//проверка на наличие дубликатов почтовых адресов
$result1 = mysql_query("select * from users where mail = '$mail'");
if (mysql_num_rows($result1)>0 ){
echo 'на этот адрес уже зарегистрирован пользователь'; exit;
}

//вставка в бд
$result2 = mysql_query("insert into users values('','$name','$mail','$pass"); // первое значение autoincrement ID

//получаем ID последнего (текучего) пользователя, для этого есть легкие способы, но на случай защиты от одновременной регистрации, (такое тоже наверно бывает) делаю запрос такого типа

$result3 = mysql_query("select * from users where mail = '$mail'");
$row = mysql_fetch_array($result3);
$id = $row['id']; // получаем текучий ID

//заполняем вторую таблицу

$result4 = mysql_query("insert into table1 values('$id','$text1','$text2','$text3')");

//заполняем третью таблицу
$result5 = mysql_query("insert into table2 values('$id','$text1','$text2','$text3')");


Правильно ли я реализовал добавление строк сразу в 3 таблицы. И какую помощь даст именно реляционная модель? мне на примере кода легче будет объяснить, чем теорией)



Спустя 50 минут, 33 секунды (26.11.2010 - 15:33) vasa_c написал(а):
Где три таблицы? Зачем? Опишите их структуру

Цитата
//получаем ID последнего (текучего) пользователя, для этого есть легкие способы, но на случай защиты от одновременной регистрации, (такое тоже наверно бывает) делаю запрос такого типа

А что если эта одновременная регистрация произошла между INSERT и SELECT? smile.gif
http://php.net/mysql_insert_id

Спустя 29 минут, 31 секунда (26.11.2010 - 16:03) maximka787 написал(а):
Это просто схема, наглядно чтобы было видно что я хочу.
userid, name, password, email...;
id_tab1, userid, text1, text2;
id_tab2, userid, text1, text2;

мне нужно разобраться с одновременным заполнением 3х таблиц, где будет одинаковый ключ. Можно ведь объединить запросы в один и не искать последний ID? как в моём "чудо" коде.

Спустя 13 минут, 9 секунд (26.11.2010 - 16:16) vasa_c написал(а):
Как "не искать последний ID" я дал ссылку.

Если же интересно обсудить, как всё это сделать не через пятую точку, то всё-таки приведите структуры таблиц и опишите зачем вам они понадобились.

Спустя 11 минут, 59 секунд (26.11.2010 - 16:28) maximka787 написал(а):
На счет mysql_insert_id я написал, что это и есть легкий способ. Речь сейчас не совсем о нем. Можно как то объединить 3 запроса, точнее 4 в один?

1. insert into таблица1 values ('','значение','значение','значение'); // где первая колонка '' и есть Id вновь зарегистрированного.

2. Поиск последнего id //если объединить все запросы в один, то этот можно не выполнять.

3. Добавление во вторую таблицу данных с этим ID

4. Добавление в третью таблицу данных с этим ID



в моем коде самого первого сообщения этой темы написана реализация этого блока, но отдельными запросами.

Спустя 15 минут, 6 секунд (26.11.2010 - 16:43) vasa_c написал(а):
Нет, нельзя

Спустя 31 минута, 24 секунды (26.11.2010 - 17:14) maximka787 написал(а):
Такого не может быть, ведь ключи в БД могут как-то тоже влиять. в том числе и insert-ы в разные таблицы тоже должны существовать. Меня учили триггеры давно, но я думаю если есть какие-то варианты

Спустя 4 минуты, 22 секунды (26.11.2010 - 17:19) vasa_c написал(а):
Почему должны? Для чего должны?

Спустя 3 минуты, 15 секунд (26.11.2010 - 17:22) maximka787 написал(а):
Потому что существуют связи таблиц. Ведь можно как-то связать таблицы не только на логическом уровне "в уме"? Я не могу делать триггеры, хотя они в данном случае помогли бы. Т.е при работе одного инсерта, срабатывают еще необходимые мне запросы, без использования php. Не все хостинг операторы дают такую возможность использовать триггеры

Спустя 18 минут, 43 секунды (26.11.2010 - 17:40) vasa_c написал(а):
Покажите эти таблицы и эти связи. Судя по тому что вы пока сказали, вы пытаетесь сделать связь по первичному суррогатному ключу, а этого делать не надо.

Спустя 11 минут, 3 секунды (26.11.2010 - 17:52) maximka787 написал(а):
Цитата (vasa_c @ 26.11.2010 - 14:40)
Покажите эти таблицы и эти связи. Судя по тому что вы пока сказали, вы пытаетесь сделать связь по первичному суррогатному ключу, а этого делать не надо.

Есть 3 таблицы

CREATE TABLE IF NOT EXISTS `users` (
`userid` int(10) unsigned NOT NULL auto_increment,
`name` char(50),
`mail` char(50),
PRIMARY KEY (`userid`)
)
ENGINE=MyISAM;

CREATE TABLE IF NOT EXISTS `test1` (
`id` int,
`userid` int,
`text` text
) ENGINE=MyISAM;

CREATE TABLE IF NOT EXISTS `test2` (
`id` int,
`userid` int,
`text` text
) ENGINE=MyISAM;


Связь задается userid. Тоесть региться первый пользователь, например ему автоматически присвоен номер 1. дальше надо чтобы сразу заполнились и две другие

Спустя 11 минут, 25 секунд (26.11.2010 - 18:03) vasa_c написал(а):
Либо сводить в одну таблицу, либо 3 запроса, либо хранимая процедура или триггер.

Цитата
//получаем ID последнего (текучего) пользователя, для этого есть легкие способы, но на случай защиты от одновременной регистрации, (такое тоже наверно бывает) делаю запрос такого типа

Если под легким способом подразумевался mysql_insert_id, то он не только более легкий, но и защищает от одновременной регистрации, в отличии от вашего.

Спустя 2 минуты, 49 секунд (26.11.2010 - 18:06) maximka787 написал(а):
Цитата (vasa_c @ 26.11.2010 - 15:03)
Если под легким способом подразумевался mysql_insert_id, то он не только более легкий, но и защищает от одновременной регистрации, в отличии от вашего.

А почему он поможет? а вдруг сервер подвиснет между mysql_insert_id и созданием следующей таблицы, а у другого прользователя нет? я думаю по сути это одно и тоже)

Спустя 4 минуты, 19 секунд (26.11.2010 - 18:10) vasa_c написал(а):
созданием следующей таблицы?

mysql_insert_id возвращает последний инкремент в рамках данного соединения, то есть только данного сценария. Параллельные соединения на него не влияют.

А вот в вашем случае, как раз, между INSERT и SELECT может вклинится параллельный INSERT, причём серверу нет необходимости даже подвисать для этого.

Спустя 2 минуты, 48 секунд (26.11.2010 - 18:13) maximka787 написал(а):
Цитата
причём серверу нет необходимости даже подвисать для этого
Железная логика)
Цитата
вы пытаетесь сделать связь по первичному суррогатному ключу, а этого делать не надо.
а вот по этому ответу что имелось ввиду? я не совсем понял про суррогатный ключ.

Спустя 26 минут, 27 секунд (26.11.2010 - 18:39) vasa_c написал(а):
ID - суррогатный ключ, то есть введённый искусственно, не относясь к самим хранимым данным. Но в итоге, как оказалось, вы всё-таки связываете по вторичному.

Если у вас несколько таблиц связаны, как один к одному, то возможно, лучше было бы объединить их в одну.

Спустя 22 минуты, 7 секунд (26.11.2010 - 19:01) maximka787 написал(а):
Цитата (vasa_c @ 26.11.2010 - 15:39)
Если у вас несколько таблиц связаны, как один к одному, то возможно, лучше было бы объединить их в одну.

Я бы рад, но тогда смысл этой темы теряется, так и буду суррогатные ключи использовать. Да и значений бывает в таблицах около 50-ти, это в ширину огромные таблицы)

В любом случае я не знаю как обойтись без php. Все равно, даже если связи и не один к одному, то приходится извлекать номер записи id средствами php и делать отдельный запрос insert. Книга у меня по mysql огромная, я ее отдал, но заберу. Я не думаю что там написано только как сохранять и извлекать данные smile.gif В конце концов SQL сервер тоже может половину работы делать сам.

Спустя 2 часа, 30 минут, 4 секунды (26.11.2010 - 21:32) kirik написал(а):
Цитата (maximka787 @ 26.11.2010 - 11:01)
Да и значений бывает в таблицах около 50-ти, это в ширину огромные таблицы)

Да ничего страшного, вам-то какая разница?

Спустя 1 день, 5 часов, 30 минут, 26 секунд (28.11.2010 - 03:02) maximka787 написал(а):
Цитата (kirik @ 26.11.2010 - 18:32)
Да ничего страшного, вам-то какая разница?

Мне никакой), но нужно привыкать делать все правильно, и не глупо. Правильно использовать конечно расширение таблицы вертикально, но в данном случае я думаю лучше использовать одну строку, тк с ней легче работать.


_____________
..Работает - не трогай!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.