Друзья в приложении, которые могут быть как пользователями приложения, так и не пользователями - как спроектировать модель данных? - PullRequest
0 голосов
/ 06 января 2019

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

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

CREATE TABLE IF NOT EXISTS Record (
    record_id INT NOT NULL, -- primary key
    record_col VARCHAR(45) NULL, -- some column describing the record
    added_by_id VARCHAR(45) NOT NULL, -- references user_id from the User table
    added_for_id VARCHAR(45) NOT NULL -- references user_id from the User table
);

Однако, поскольку можно добавлять друзей, которые не являются пользователями приложения, а затем добавлять записи для них, я думаю, что мне нужна дополнительная таблица для хранения информации о друзьях:

CREATE TABLE IF NOT EXISTS Friend (
    friend_id INT NOT NULL, -- primary key
    friend_col VARCHAR(45) NULL, -- some column describing the friend
    friend_of_user_id VARCHAR(45) NOT NULL, -- id of the user who added this friend
    is_user BIT(1) NOT NULL, -- boolean indicating if this friend has already created an account
    friend_user_id INT NULL -- if above is true, user_id of this friend would go here
);

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

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

Что мне здесь не хватает? Это не кажется чем-то необычным, но я не могу найти правильного решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...