ВЫБРАТЬ, чтобы получить данные против хранения в поле? - PullRequest
0 голосов
/ 12 января 2011

Немного предыстории: (пропустите ниже, чтобы выделить жирным шрифтом, чтобы просто перейти к вопросу)

Я программировал на Python последние несколько месяцев, но явсе еще очень начинающий.Я знаю основы (циклы, операторы if, функции, классы и т. Д.), Но мне не хватает более тонких знаний (нотация big-o, как работают индексы и т. Д.).

У меня есть база данных sqlite, которую яхранил данные для проекта.В одной таблице, называемой бумагами, каждая строка состоит из статьи, которую я написал, вместе с классом, для которого она была, категорией (технология, художественная литература, технический документ и т. Д.) И рейтингом, связанным с ней (1-5).

Итак, моя таблица выглядит примерно так:

PID|                Paper Name       |        Class      |     Category          |  Rating

 1 | A Foo Bar Story: The study of X |   Intro to Foobar |  Term Paper, Science  |  4

... (и т. Д.)

Я также создал еще одну таблицу под названием Classes, которая выглядит примерно так:

Class Name | ClassURL | Teacher Email | Ratings | Vote count

Intro to Foobar | www.foobar.com/itf | xyz@zyx.com | 240 | 100

... (и т. Д.)

Где рейтинг класса - это рейтинг, разделенный на количество голосов.

Мой вопрос: : Прямо сейчасВ настоящее время я просто обновляю поле оценок и поле подсчета голосов, когда я оцениваю статью, добавляя этот рейтинг для статьи в «рейтинги» и добавляя один к «подсчету голосов», используя UPDATE classes SET ratings=(?), vote_count=(?) where classname=(?) (с переменными).
В то время я думал, что это будет менее сложно, чем сделать SELECT всех бумаг в бумажном столе (что, допустим, может быть безграничным) WHERE class= "Whatever", затем сложить их все, а затем разделить насчет.Однако чем больше я думаю об этом, тем больше я не уверен в этом.Может ли кто-нибудь указать мне, какой из них будет быстрее по большой базе данных и почему?

1 Ответ

2 голосов
/ 12 января 2011

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

Вы можете легко рассчитать оценки классов, используя SUM и COUNT, например (непроверено!)

SELECT ClassName, SUM(Rating)/COUNT(*) FROM Papers GROUP BY ClassName

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

Вы должны удалить лишние столбцы Classes.Ratings иClasses.Votecount, если у вас нет действительно веских причин для их сохранения.Я думаю, что SELECT с оценками классов может быть немного быстрее, если вы сохраните избыточные столбцы, особенно.если вы хотите иметь рейтинг класса наряду с другими атрибутами класса, такими как адрес электронной почты учителя.Но это совершенно не имеет значения, если, например, у вас не очень большая база данных, запрашиваемая веб-сайтом с очень высоким трафиком, в чем я сомневаюсь.

Если вам нужна скорость, сохранение избыточных столбцов определенно не первый шаг.Я не уверен, как sqlite обрабатывает индексирование - в MySQL вы должны убедиться, что таблица Papers имеет индекс для столбца ClassName, чтобы ускорить выполнение запроса выше.Если вы выполняете сложные запросы (которые, между прочим, вышеупомянутым не являются), начните сначала оптимизировать свои запросы.

...