2016-11-06 6 views
0

Я создал чат приложения и его чат видел SQL выглядеть нижеСделать уникальную ключевую работу со значениями NULL?

chat_seen --table name 
--Columns--- 
from_user | to_id | group_id | unseen_count 

Он работает следующим образом: Когда group_id является NULL это означает, что это 12:59 чат, если group_id не нулевой from_user является конечным пользователем который написал сообщение, а to_id - это пользователь, который является членом группы. У меня есть внешний ключ в group_id, и он ссылается на таблицу групп, и у меня есть уникальный ключ для 3 столбцов (from_user, to_id, group_id). Когда group_id имеет значение null, он должен работать, потому что from_user и to_id должен быть уникальным в одном чате, но в групповом чате он должен быть уникальным для group_id, это будет работать, если уникальный ключ работает с NULL VALUES, потому что если он будет работать, он будет считать значения group_id NULL как group_id и для группы NULL from_user и to_id будет уникальным. Я не могу изменить grou p_id на что-либо, потому что у него есть внешний ключ.

Я также хочу достичь этого, если group_id не имеет значения null to_id должен иметь внешний ключ и должен ссылаться на член группы, group_id не равен NULL, он должен ссылаться на user_id в таблице пользователя.

Обновленная версия с примерами

Когда кто-то в сообщении группы записи на сообщение я вставить или обновления (если существует) в chat_seen таблицу для каждого пользователя, это означает, что если группа содержит 20 человек в каждом сообщении я будет обновлять или вставлять 20 столбцов, чтобы уведомить их позже, если они не видят чат. И я обновляю unseen_count для каждого пользователя.

Что мне делать? Любое предложение?

+0

Это не работает (по уважительным причинам). Технически вы можете просто добавить новый столбец с 'group_memberid' и оставить' to_id''null' для групповых чатов, а затем создать уникальный ключ для обеих комбинаций (groupchat и 1-1-chat). С другой стороны, у вас могут быть некоторые проблемы в вашем дизайне (хотя я не знаю вашего db, так что это просто догадка): а) членство в группах может измениться, поэтому внешний ключ в таблице групп может не работать (например, если вы уйдете и воссоединитесь, вы пропустили некоторые сообщения) и b) в групповом чате 'from' обычно не относится к' seen', поэтому, возможно, 'group_id' заменит' from'. – Solarflare

+0

И общий комментарий: немного сложно следовать вашему дизайну и вашим требованиям только от вашего текстового описания. Было бы намного легче следовать, если вы добавите некоторые примеры данных (и ваши другие таблицы, особенно таблица участников группы, будут приятными). И поскольку я не упоминал об этом: стандарт sql определяет поведение уникальных ключей так, как они работают в mysql: если у вас есть «нуль» в ключевом столбце, они не уникальны. – Solarflare

+1

Присвоение некоторого значения NULL, за отсутствующим значением, поэтому неизвестное значение, как правило, полны подводных камней. Это одна из них. Вы пытаетесь сделать NULL означающим нечто иное, чем SQL хочет это означать. –

ответ

0

Я решил эту проблему немного взломать. Когда один-один чат вставляет в таблицу chat_seen, сначала я проверяю from_user на null или нет, потому что я разрешил from_user быть null (я объясню это позже). Затем у меня есть созданный from_user и to_id Уникальный ключ. Теперь у меня есть 2 Уникальный ключ 1) from_user и to_id, а другой - 2) to_id и group_id (у меня есть delete from_user из этого уникального ключа). Когда пользователь вставляет в таблицу chat_seen с mod_chat mod, я вставляю null from_user, потому что я хочу игнорировать 1) Uniuqe ключ для групп, если группа равна null, это означает один-один чат. 2) уникальный ключ будет игнорироваться.

1

Назначьте поле «Идентификатор» для групп и поле «Идентификатор» для пользователей из одного и того же генератора автозавершения. Это гарантирует, что данный идентификатор может быть либо пользователем, либо группой, но не тем и другим.

Теперь устраните команду Group_Id в таблице. Вместо этого просто сохраните groupId в поле To_Id для групповых сообщений и сделайте уникальным свойство From_Id и To_Id.

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

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

+0

Спасибо за ваш ответ, я думаю, что это предложение может решить мою проблему «Назначьте поле« Идентификатор »для групп и поле« Идентификатор »для пользователей из одного и того же генератора автопоследовательности». , но немного неясно, не могли бы вы предоставить мне подробности об этом? Что это значит «тот же самый генератор автопоследовательности». Должен ли я дать ключ для ввода, но я не могу дать 2 внешних ключа одному столбцу. – Bucky

+0

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

+0

Реальная сделка заключается в том, что пользователи и группы являются получателями, но они идут в разных таблицах. Используя тот же автообъявление, я действительно обойдусь полным ответом моделирования. Он должен определить таблицу получателей, а затем использовать общий первичный ключ для репликации recipientId в качестве идентификатора пользователя или группы. В вашем случае это слишком много. –