Я пишу приложение, в котором пользователи приложения могут добавлять друзей, с которыми они могут позже делиться вещами внутри приложения. Дело в том, что они могут добавлять друзей, которые уже используют приложение (простой случай), но они также могут добавлять людей, которые еще не используют приложение, но могут начать делать это однажды (сложная часть). В последнем случае они могут просто добавить запись в приложение, а затем поделиться ею по электронной почте, но запись все равно необходимо сохранить в базе данных. Важно отметить, что всякий раз, когда пользователь добавляет запись для друга, для него / нее также добавляется запись (поскольку они делятся информацией, мне также необходимо добавить информацию о роли пользователя).
Если бы друзья могли быть только пользователями приложения, я бы просто имел таблицу 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. Мне это не кажется правильным ...
Я также мог бы попытаться поместить всех (как пользователей приложений, так и не пользователей) в одну таблицу, но тогда для одного и того же физического лица (пусть это будет Джон Смит) у меня было бы потенциально несколько записей, добавленных разными людьми, которые дружат с Джон и запись, представляющая фактического Джона Смита, являющегося пользователем приложения. Это кажется противным.
Что мне здесь не хватает? Это не кажется чем-то необычным, но я не могу найти правильного решения.