Перейти к содержимому

Реферальная программа Мегаплана

Партнерская программа Kredov

Наличие новых сообщений в теме, как реализовано?

#11 admin

admin
  • Пользователь PRO
  • 5 272 сообщений
  • Репутация: 54
3

Отправлено 21 Май 2013 - 17:48

А если пользователь год не заходил на форум, потом зашёл и там тысячи новых тем. Почему-то вдруг он решил не просматривать их все и нажал на кнопочку "Отметить все сообщения прочитанными". Что происходит в этот момент? В таблицу `visit` добавляется тысячи записей?
  • 0

Сколько лет прошло, а ссылки всё ещё лучше покупать тут



#12 html-ka

html-ka
  • Пользователь
  • 455 сообщений
  • Репутация: 82

Отправлено 22 Май 2013 - 01:40

и в чем нарушение нормализации?


  • 0

#13 MEGApixel

MEGApixel
  • Пользователь
  • 105 сообщений
  • Репутация: 6

Отправлено 22 Май 2013 - 18:11

и в чем нарушение нормализации?

Разрушается атомарность данных, хранящихся в одной ячейке. Это первая нормальная форма. Почитайте подробнее ЗДЕСЬ, если интересно

А если пользователь год не заходил на форум, потом зашёл и там тысячи новых тем. Почему-то вдруг он решил не просматривать их все и нажал на кнопочку "Отметить все сообщения прочитанными". Что происходит в этот момент? В таблицу `visit` добавляется тысячи записей?


А что если сделать какую-то метку в таблице для тех случаев, когда пользователь нажимает "Отметить все сообщения прочитанными"? Вот только как её реализовать, не совсем сейчас могу сообразить. Есть у кого-то идеи? А вы, ув. Админ, как бы решили задачу ТС?
  • 1

#14 html-ka

html-ka
  • Пользователь
  • 455 сообщений
  • Репутация: 82

Отправлено 22 Май 2013 - 21:10

и какая атомарность нарушена в данном случае?


  • 0

#15 fedornabilkin

fedornabilkin
    Topic Starter
  • Пользователь
  • 696 сообщений
  • Репутация: 91

Отправлено 23 Май 2013 - 09:57

Это один из основных принципов работы БД. MEGApixel, в данном случае прав и с этим не поспоришь.
После долгих раздумий и приведенных вариантов в этой теме, представляю себе вот что.
1. Определяем темы, в которых быдут подсвечиваться новые сообщения. Тема, которую создал юзер, тема в которой есть хотя бы один пост юзера. Так через три месяца отсутствия не получится тысяча тем и записей в таблице.
2. Для меня ближе создание отдельной таблицы для этих целей, поэтому вариант MEGApixel вполне подходит. В этой таблице можно делать доп поле, по которому связывать незарегистрированных пользователей куками. В таблицу записывать не время посещения темы, а время последнего поста.
3. Кнопка "Отметить все как прочитанное" работает следующим образом. Если человек нажимает эту кнопку, то дальнейшее развитие тем ему не интересно. Значит удаляем соответствующие записи из таблицы(вариант очистки).

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


  • 0
Как часто в горестной разлуке,В моей блуждающей судьбе, ФО, я думал о тебе.


#16 MEGApixel

MEGApixel
  • Пользователь
  • 105 сообщений
  • Репутация: 6

Отправлено 23 Май 2013 - 10:02

и какая атомарность нарушена в данном случае?


Ну под атомарностью подразумевается, что в одной ячейке будет храниться только одно значение. id_user - только одна цифра, name - только одно слово, и т.д. А если кучу информации запихать в одну ячейку - это никак не атомарные данные.

Это сделанно для того, я так думаю, чтобы БД в будущем могла легко масштабироваться, могли устанавливаться новые внутренние и внешние связи, была однозначной и самодокументируемая.
  • 0

#17 html-ka

html-ka
  • Пользователь
  • 455 сообщений
  • Репутация: 82

Отправлено 23 Май 2013 - 14:50

То что я впервые слышу на этом форуме про нормализацию, это радует, но то, что вы не знаете базовый синтаксис SQL это огорчает. есть такое понятие как разумность должна быть во всем, если фанатично следовать всему, и в сложной базе данных все нормализовать, то она раздуется до невероятных размеров, и вот здесь попадутся грабли в виде маштабирования и оптимизации, и для выборки данных нужно будет писать километровые запросы, чтоб вывести нужые,данные и большая вероятность грузануть сервак.

Если исходить из твоей логике, то запись даты будет тоже нарушена атомарность, т.к. там есть год, месяц, число, часы, минуты и секунды :) хотя это тип данных поддерживаемый MySQL

Теперь по делу, массив, который вы получите собирая для хранения в БД вы не сможете записать в таблицу, т.к. реляционная база данных не поддерживает такой тип данных, следовательно, чтоб записать массив, вам нужно будет преобразовать его в строку, в php это можно будет с помощью 2-х функций:

implode — Объединяет элементы массива в строку
Возвращает строку, содержащую строке представление всех элементов массива в указанном порядке, со строкой glue между каждым элементом.

serialize — Генерирует пригодное для хранения представление переменной
Возвращает строку, содержащую потоковое представление переменной value, которая может быть сохранена где угодно.

Полученная строка уже заноситься в таблицу, а здесь уже включаются другие законы,и вероятнее всего она будет даже уникальной, и никакие нормализации она не нарушает.
  • 0

#18 MEGApixel

MEGApixel
  • Пользователь
  • 105 сообщений
  • Репутация: 6

Отправлено 24 Май 2013 - 10:36

что вы не знаете базовый синтаксис SQL это огорчает.


Переходить на личности не очень правильно. Но все же, от куда такая уверенность?

Ваша мысль имеет право на существования.
Но я сторонник того, чтобы все операции с БД выполняла именно СУБД. Она для того и создана. Не совсем правильно перекладывать это на скрипт. Это еще большой вопрос, что сильнее нагрузит сервер.

Если исходить из твоей логике, то запись даты будет тоже нарушена атомарность, т.к. там есть год, месяц, число, часы, минуты и секунды :) хотя это тип данных поддерживаемый MySQL


Во-первых, правила нормализации не я придумал. На этих принципах строится все суть реляционных БД.
Во-вторых, запись даты никак не нарушает атомарность данных. Как раз таки потому, что MySQL имеет такой тип данных и умеет корректно с ним работать.

Интересно, есть еще сторонники теории пользователя html-ka (что все данные нужно сериализовать в строку и занести в одну ячейку для каждого пользователя)?
  • 0

#19 fedornabilkin

fedornabilkin
    Topic Starter
  • Пользователь
  • 696 сообщений
  • Репутация: 91

Отправлено 24 Май 2013 - 15:38

Не, я не сторонник сериализации. Я сторонник нормализации и рационализма :)
Поэтому думаю тему есть смысл продолжать как для решения задачи, так и для общего развития.
Благодарю тех, кто участвует в дискуссии.
  • 0
Как часто в горестной разлуке,В моей блуждающей судьбе, ФО, я думал о тебе.


robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85


Оформление форума – IPBSkins.ru