Bermuda
Новичок
Модель данных для простой системы сообщений.
"Рисую" модель данных для системы сообщений между двумя пользователями. Пытаюсь определить необходимые сущности. Уже ясно, что будет сущность "сообщение". Поскольку требуется возможность вывода сообщений цепочками, то понадобится сущность "цепочка" со связью один ко многим с сообщениями. Цепочка линейная (не древовидная), сообщения "группируются" по теме и сортируются по времени.
Затык произошел на этапе удаления сообщений. Если получатель удалит сообщение, то отправитель его также лишиться. Вижу несколько вариантов.
А. Сохранять одну копию сообщения указывая отправителя и получателя.
Сущности: цепочка, сообщение.
В таком случае непонятно как удалить сообщение так, чтобы оно не пропало на другом конце.
Б. Сохранять две копии сообщения -- одну для отправителя, другую для получателя.
Сущности: цепочка, сообщение.
Уж не знаю почему, но не нравится мне этот вариант. Слишком уж избыточно.
В. Упразднить сущность "сообщение" и ввести две новые сущности "входящее сообщение" и "исходящее сообщение". Также придется сохранять две копии -- одну в исходящих, другую во входящих.
Сущности: цепочка, входящее сообщение, исходящее сообщение.
Концептуально может оно и правильно, но как потом показывать цепочку сообщений? Смешивать, а потом сортировать две разные сущности? Снова как-то избыточно, да и сущности практически идеентичны.
Г. Ввести сущность "очередь сообщений". Попробую объяснить.
Таблица "очередь сообщений"
- идентификатор пользователя
- идентификатор сообщения
- флаг входящее/исходящее
При создании сообщения создается две записи в таблице "очередь сообщений". Одна с идентификатором отправителя, идентификатором сообщения и флагом "исходящее", вторая запись с идентификатором получателя, идентификатором сообщения и флагом "входящее".
Сущности: цепочка, очередь сообщений, сообщение.
Таким образом сообщение хранится в единственной копии, имеется возможность вывести цепочку сообщений, каждый пользователь может независимо удалять сообщения путем удаления записи из таблицы "очередь сообщений". Появляется проблема, если получатель и отправитель удалили сообщения, то в таблице "очередь сообщений" не останется записей, а в таблице сообщений останутся осиротевшие сообщения. Т. е. этот момент нужно контролировать программно. Как только удаляется последняя ссылка на сообщение в таблице "очередь сообщений", то удаляется и само сообщение. Тоже получается как-то через опу.
Пожалуйста, подкиньте идею. Может кто уже "рисовал" модель данных для такой задачи.
"Рисую" модель данных для системы сообщений между двумя пользователями. Пытаюсь определить необходимые сущности. Уже ясно, что будет сущность "сообщение". Поскольку требуется возможность вывода сообщений цепочками, то понадобится сущность "цепочка" со связью один ко многим с сообщениями. Цепочка линейная (не древовидная), сообщения "группируются" по теме и сортируются по времени.
Затык произошел на этапе удаления сообщений. Если получатель удалит сообщение, то отправитель его также лишиться. Вижу несколько вариантов.
А. Сохранять одну копию сообщения указывая отправителя и получателя.
Сущности: цепочка, сообщение.
В таком случае непонятно как удалить сообщение так, чтобы оно не пропало на другом конце.
Б. Сохранять две копии сообщения -- одну для отправителя, другую для получателя.
Сущности: цепочка, сообщение.
Уж не знаю почему, но не нравится мне этот вариант. Слишком уж избыточно.
В. Упразднить сущность "сообщение" и ввести две новые сущности "входящее сообщение" и "исходящее сообщение". Также придется сохранять две копии -- одну в исходящих, другую во входящих.
Сущности: цепочка, входящее сообщение, исходящее сообщение.
Концептуально может оно и правильно, но как потом показывать цепочку сообщений? Смешивать, а потом сортировать две разные сущности? Снова как-то избыточно, да и сущности практически идеентичны.
Г. Ввести сущность "очередь сообщений". Попробую объяснить.
Таблица "очередь сообщений"
- идентификатор пользователя
- идентификатор сообщения
- флаг входящее/исходящее
При создании сообщения создается две записи в таблице "очередь сообщений". Одна с идентификатором отправителя, идентификатором сообщения и флагом "исходящее", вторая запись с идентификатором получателя, идентификатором сообщения и флагом "входящее".
Сущности: цепочка, очередь сообщений, сообщение.
Таким образом сообщение хранится в единственной копии, имеется возможность вывести цепочку сообщений, каждый пользователь может независимо удалять сообщения путем удаления записи из таблицы "очередь сообщений". Появляется проблема, если получатель и отправитель удалили сообщения, то в таблице "очередь сообщений" не останется записей, а в таблице сообщений останутся осиротевшие сообщения. Т. е. этот момент нужно контролировать программно. Как только удаляется последняя ссылка на сообщение в таблице "очередь сообщений", то удаляется и само сообщение. Тоже получается как-то через опу.
Пожалуйста, подкиньте идею. Может кто уже "рисовал" модель данных для такой задачи.