Как хранить и извлекать много данных для поиска по конкретной дате + сводный поиск? - PullRequest
1 голос
/ 25 сентября 2010

Упрощенный регистр:

Хранение

  1. Пользователи нажимают на ссылку
  2. link_clicks +1 за каждый клик
  3. Суперпользователь устанавливает параметр множителя для каждого клика
  4. link_reward (+1 * param) для каждого клика
  5. Идентификатор пользователя также записывается для каждого клика

Извлечение

  • Запросы должны выполняться в определенный диапазон дат (например, «Сколько кликов между 10 и 23 октября для ИД пользователя = 4»)
  • Однако большинство запросов будет выполняться по сумме всех дат для данного пользователя.

Если таблица становится массивной, оба типа запросов будут работать очень медленно, верно?

Какодин справляется с этим?Одновременно хранить в одной подробной таблице (строка на клик на пользователя на ссылку) и в одной сводной таблице (строка на пользователя на ссылку)?Я слышал о «сворачивании» данных, но я не знаю, что это значит.

Используемые технологии: MySQL, PHP (и Javascript)

Ответы [ 2 ]

1 голос
/ 25 сентября 2010

Легко. : -)

Одна таблица для пользователей, я бы назвал ее Пользователь.

Одна таблица для кликов, я бы назвал ее ClickEvent.

Одна таблица для каждой отдельной ссылки, я бы назвал ее HyperLink (избегая слова «ссылка» в БД)

Таблица пользователей, учитывая то, что мы знаем (не очень), не очень материальна для вопросов или ответов.

Таблица HyperLink будет местом хранения всей информации по каждой ссылке, столбцы:

  • HyperLinkID
  • URL
  • ClickValue
  • RewardMultiplier

(Я думаю, что то, что вы указали, присваивает значение и множитель сущности ссылки, а не каждому событию одного щелчка, верно?)

Таблица ClickEvent занимает центральное место в вашем вопросе / ответе. Я бы дал столбцы следующим образом:

  • ClickEventID, int (PK)
  • UserID, int (FK)
  • HyperLinkID, int (FK)
  • ClickDateTime, datetime
  • ComputedEventValue (десятичное или smallmoney)

Ваше беспокойство о скорости должно быть приглушено - это не очень интенсивно, даже при большой активности. Каждая транзакция (клик) регистрируется в таблице ClickEvent. Каждое событие щелчка вставляет новую запись, и во время вставки записывается значение ComputedEventValue.

Кажется, это покрывает основную идею, как я ее вижу.

1 голос
/ 25 сентября 2010

Как с этим справиться?Одновременно хранить в одной подробной таблице (строка на клик на пользователя на ссылку) и в одной сводной таблице (строка на пользователя на ссылку)?

Да, но добавить столбец DATETIME, чтобы вы могли сделатьпериод проверки вы упомянули в (а).Заполните столбец DATETIME, используя функцию NOW(), чтобы получить текущую дату и время.Что касается варианта (а), следует помнить, что критерии будут минимизировать сводные данные, поэтому производительность не должна быть слишком большой.Кроме того, таблицу подробностей, вероятно, не следует индексировать, поскольку индексы помогают только получать данные из и замедляют помещение данных в таблицу .

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

Я слышал о "сворачивании" данных, но я не знаю, что это значит.

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

...