2013-05-03 3 views
0

У меня есть users таблицы в моей базе данных, где у меня есть DeviceId, в pushTokenOS.Связь между таблицами в базе данных MySql

У меня есть другой стол subscriptions. Эта таблица содержит deviceID и pushToken подписчиков пользователей.

Когда я делаю новый INSERT в таблице subscriptions, у меня есть только deviceID пользователя, который хочет подписаться. Есть ли способ подключения этих двух таблиц, чтобы при вставке deviceIDpushToken был автоматически вставлен из другой таблицы? Или, если не автоматически, может быть, будет простой способ ссылаться на него, поскольку таблицы будут связаны? Я спрашиваю, так что я хотел бы избежать еще один запрос к users таблице, чтобы получить pushToken, а затем вставьте его в subscriptions таблице

Я думаю, что это что-то делать с внешними ключами, но я не уверен. Может ли кто-нибудь предоставить мне простой пример кодирования или учебник по этому вопросу?

Я использую php.

ответ

0

Это очень плохой дизайн. Столбец имени таблицы подписок является избыточным. Если у него нет веских оснований для его сохранения, я бы склонен отказаться от него.

+0

Я заполнил имена таблиц, чтобы каждый мог понять мой пример ... на самом деле есть devideID и pushTokens .. – 2013-05-03 16:07:34

+0

«последнее имя», вероятно, является эффективной ссылкой на отношения. так что вы не потеряете 'last name', не заменяя его колонком' user_id', чтобы поддерживать связь с таблицей 'user' – gillyspy

+0

, ребята смотрят мое редактирование. я сожалею о путанице, но это не так. имена составлены так, что вопрос не слишком технический. – 2013-05-03 16:12:42

0

Это звучит, как базы данных выглядит следующим образом:

users 
----- 
deviceID 
pushToken 
OS 

subscriptions 
------------- 
deviceID 
pushToken 

Если это так, то вы можете вставить DeviceId и pushToken в таблицу подписок в то же время, даже если у вас есть только DeviceId с помощью запрос, как это (предполагается, что «123abc» является DeviceId вы вставляете):

INSERT subscriptions (deviceID, pushToken) 
SELECT deviceID, pushToken 
FROM users 
WHERE deviceID = '123ABC'; 

Однако, это обычно не считается, что хороший дизайн для базы данных. Как правило, вы не хотите повторять данные в двух местах. В этом случае идентификаторы deviceID и pushToken сохраняются как в таблице пользователей, так и в таблице подписок. Это может быть улучшение:

users 
----- 
id 
deviceID 
pushToken 
OS 

subscriptions 
------------- 
id 
user_id 

Если база данных была построена таким образом, вы можете вставить новую запись в таблицу подписки, используя этот SQL (опять же для DeviceId из «123abc»):

INSERT subscriptions (user_id) 
SELECT id 
FROM users 
WHERE deviceID = '123ABC'; 

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

Нет необходимости указывать идентификатор устройства в таблице подписок. Просто иметь идентификатор пользователя достаточно, чтобы «соединить» таблицы. Вы будете «подключать» эти таблицы, используя SQL из своего php-кода.Если вы хотите знать DeviceId и pushToken пользователя с подпиской на 25, то SQL может выглядеть следующим образом:

SELECT deviceID, pushToken FROM users, subscriptions 
WHERE users.id = subscriptions.user_id AND subscriptions.id = 25; 

Если вы хотите знать все подписки, принадлежащие пользователю с DeviceId «123abc», попробуйте это запрос:

SELECT * FROM users, subscriptions 
WHERE users.id = subscriptions.user_id AND user.deviceID = '123ABC'; 

Надеюсь, что это поможет.

+0

Я завершил изменение имен таблиц, чтобы каждый мог понять мой пример ... на самом деле есть devideID и pushTokens .. – 2013-05-03 16:08:24

+0

Возможно, вам лучше описать ваши фактические таблицы, чтобы мы могли легче помочь. Однако, если ваши поля касаются подписки, их следует иметь в таблице подписки, но если они касаются пользователя, они определенно не входят в таблицу подписки. User_id - единственное, что нужно в таблице подписки, чтобы получить все остальное, что вам нужно, из таблицы users, когда вы хотите узнать что-то о пользователе, которому принадлежит эта подписка. –

+0

Благодарим за дополнительную информацию о вашей базе данных. Я отредактировал свой ответ в ответ. –

Смежные вопросы