Что такое приемлемый способ сохранения «звездного рейтинга» в базе данных? - PullRequest
5 голосов
/ 20 апреля 2010

Я буду использовать плагин jQuery для предоставления пользователю приятного интерфейса

Запрос состоит в том, чтобы отобразить 5 звезд, в сумме до 10 баллов (2 балла за звезду).
К настоящему времени я думал об использовании 7/10 в качестве формата для этого значения, но что, если в какой-то момент в будущем я получу запрос наподобие

Мы хотели бы предоставить пользователям больше выбора, давайте увеличим общий балл до 20 (чтобы каждая звезда вносила максимум 4 очка)

Я получу таблицу со смешанными значениями для столбца «звездный рейтинг»: некоторые будут похожи на 7/10, а другие будут похожи на 14/20.

Это нормально для вас, чтобы иметь эту разницу в базе данных и обрабатывать ее на логическом уровне, чтобы она была согласованной? Или предпочтительнее другой способ, чтобы запрос к таблице не приводил к противоречивым результатам за пределами приложения?
Может быть, значения с плавающей запятой могли бы помочь мне, лучше ли хранить это значение как число, меньшее или равное единице? Таким образом, в каждом из двух примеров результирующее значение, хранящееся в базе данных, будет 0,7 как число, а не как varchar, который можно запрашивать также вне приложения.

Что вы думаете?

Ответы [ 6 ]

8 голосов
/ 20 апреля 2010

Есть три варианта:

  1. Сохраните значение в виде дроби (что, честно говоря, то, что я бы, вероятно, пошел с, так как это самое низкое обслуживание
  2. Сохранить значение в двух столбцах, один для рейтинга и один для максимального
  3. Сохраните значение в виде одного столбца с предполагаемым максимумом, а затем обновите все значения при изменении этого максимума.

Первый вариант является наиболее переносимым, поскольку максимальное значение и представление рейтинга полностью на стороне клиента (на стороне клиента, когда речь идет о базе данных, а не на стороне клиента, как это делается на компьютере пользователя). ).

Второй только кажется сколь угодно сложным, если только вы не хотите продолжать отображать рейтинг 7/10 как 7 с 10 звездами, а не 14 с 20 звездами.

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

Просто повторюсь, Я рекомендую сохранить значение в виде float или double в базе данных и применить любой масштаб, подходящий на стороне клиента. .

7 голосов
/ 20 апреля 2010

KISS
Просто сохраните количество точек и используйте логику приложения для представления его в виде звездочек в IU.
Если требования изменятся в будущем, вы скорректируете логику и запустите скрипт преобразования, если это необходимо. Вот и все.

5 голосов
/ 20 апреля 2010

Я бы сохранил его как простое целое число, измеренное из 100. Таким образом, у вас будет много детализации на случай, если вы захотите повысить точность оценок в будущем. Нет необходимости изменять любые существующие сохраненные значения.

0 голосов
/ 20 апреля 2010

Мне нравится идея с плавающей точкой, но ни один из вариантов не является выдающимся. Я только предлагаю, чтобы какой бы механизм вы ни выбрали, убедитесь, что столбец назван соответствующим образом.

Параметр float должен выглядеть примерно так: star_rating_ratio. Простое целое число должно быть star_points_out_of_ten. Шкала из ста пунктов может быть star_rating_percent.

(в прошлом я видел имена столбцов, в которых было указано "проценты", но данные были простым соотношением. Это не давало мне спать по ночам!)

0 голосов
/ 20 апреля 2010

Я бы предложил хранить ваши результаты в виде простых целых чисел - если рейтинг равен 7/10, сохраните «7» в БД. Если вам необходимо изменить его на 20-балльную шкалу, просто запустите запрос на обновление, чтобы удвоить все существующие числа. Вы можете использовать числа с плавающей запятой, если вам нужна большая точность, но для большинства систем оценки целые числа должны подойти.

0 голосов
/ 20 апреля 2010

Я бы использовал два столбца: один для хранения рейтинга и один для максимального рейтинга. Поскольку этот максимум может измениться в будущем, я буду поддерживать его в ряду с остальными данными. Вы можете использовать короткие целые числа, чтобы требуемый объем пространства, даже для большого количества строк, был очень мал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...