Сделал один сайт
Он на vuejs, и сделал его на несколько языков (ru/en). Сейчас просто есть 2 файла ru.js и en.js. В них встроены все системные тексты которые есть на сайте и в зависимости от выбранного языка подключается один из файлов
Хочу прикрутить уведомления.
1) Как их собственно делать и учитывать просмотр? (в плане структуры БД)
есть пользователи USERS(user_id) и уведомления NOTIFICATIONS(not_id)
Если я не знаю сколько будет в будущем уведомление(много/мало) как в этих случаях хранить все?
- создать отдельно user_notif(user_id,notif_id) и при выпуске нового уведомления в эту таблицу каждому пользователю добавлять уведомление, а по прочтении удалять
- наоборот, только после прочтения записывать в эту таблицу и потом делать какой нибудь NOT IN
Что из этого будет правильнее и более оптимизировано?
2) Как их делать многоязычными? Просто добавлять несколько столбцов для языков(при пополнении языков сразу добавлять колонки)? Или лучше добавлять новые файлы именно в сам сайт?
Вместе с пользователем храните только ID сообщения.
В таблице сообщений храните переменные параметры и флаг (1 - новое, 0 - просмотрено)
Постоянную текстовую часть - в отдельной таблице с идентификатором языка.
...
как-то так
Artem0071, А, тогда подумайте над тем, стоит ли вообще хранить статус "прочтено/не прочтено", ибо это будет массив данных кол-во пользователей * кол-во уведомлений.
Чтобы его уменьшить, можно, например, с уведомлениями хранить дату/время. Тогда у пользователя можно хранить только 1 параметр (дату/время), на которую предполагается, что все уведомления прочитаны.
Например:
1.11 - "Уведомление 1"
2.12 - "Уведомление 2"
5.12 - "Уведомление 3"
У пользователя хранится дата 2.12, соответственно, мы знаем, что он прочитал уведомления 1 и 2, но не прочитал уведомление 3.
Вместо даты можно использовать идентификатор последнего прочитанного сообщения, подразумевая, что идентификаторы нумеруются по возрастанию
Ну а многоязычность - повторяю, уведомления сами отдельно храните с идентификаторами., например:
ID=4, DATE=2017-11-16, TYPE=2, PARAM=4
А текстовую часть отдельно:
TYPE=2 CULTURE="Ru-Ru" TEXT="Ваш платёж не выполнен в связи с {}" )
Вместо {} указываем (если PARAM=4 - "недостаточностью денег на счёте")
И то же самое по английски
TYPE=2 CULTURE="En-Us" TEXT="Your payment has not been processed due {})
PARAM=4 {"Insufficient account balance"}
Artem0071, Только имейте в виду, что при таком подходе, нужно удостовериться, что пользователь будет просматривать уведомления исключительно в порядке их поступления.
То есть, он не может прочитать более позднее, пока не прочитает более раннее - увы, это "плата" за меньший объём хранимых данных.