Вот мой, казалось бы, длинный, надеюсь, не слишком запутанный ответ на ваш вопрос. Я думаю, что покрыл большинство, если не все ваши запросы.
Для вашего веб-приложения у вас может быть таблица пользователей с именем «Пользователи», таблица настроек с именем «UserSettings» или что-то такое же описательное, а также сообщения в таблице «PrivateMessages». Тогда могут быть дочерние таблицы, в которых хранятся необходимые дополнительные данные.
Безопасность пользователя может быть сложной задачей при разработке и реализации. Вы хотите сделать это по группам (если вы планируете иметь много пользователей, упрощая управление их разрешениями), или просто назначать их индивидуально из-за небольшой базы пользователей? Для обеспечения безопасности вам понадобятся 4 таблицы:
Users
UserSettings
UserGroups
UserAssignedGroups
Таким образом, вы можете иметь информацию о пользователях, настройках, группах, которым они могут быть назначены, и то, что им назначено должным образом Это дает вам приличную гибкость и соответствует стандартам нормализации (как упоминалось выше DrSAR).
В своих сообщениях храните их не с именем пользователя, а с идентификатором пользователя. Например, в вашей таблице PrivateMessages вы должны иметь MessageID, SenderUserID, RecipientUserID, Subject, Body и DateSent для хранения самой основной информации. Таким образом, когда пользователь хочет проверить свои полученные сообщения, вы можете запросить таблицу, сказав:
SELECT * FROM PrivateMessages WHERE RecipientUserID = 123556
Список таблиц для ваших сообщений может быть таким:
PrivateMessages
MessageReplies
Таблица PrivateMessages может хранить родительское сообщение, а затем таблица MessageReplies может хранить последующие ответы. Вы можете хранить все это в одной таблице, но в зависимости от трафика и, возможно, написания рекурсивных функций для извлечения всех сообщений и ответов из одной таблицы, подход с двумя таблицами был бы наиболее простым, на мой взгляд.
На вашем месте я бы сел с карандашом и бумагой и записал / нарисовал то, что я хочу отследить в моей базе данных. Таким образом, вы можете нарисовать связи между тем, что вы хотите сохранить, и посмотреть, как это будет происходить вместе. Это помогает мне, когда я пытаюсь визуализировать вещи.