Старый вопрос, но недавно столкнулся, так что вот еще несколько вещей, о которых стоит подумать:
Вам нужно учесть несколько очень простых граничных пределов, выходящих за пределы перечисленных вами требований, при условии, что у вас нет дополнительных индексов:
Сначала, с учетом периода времени (t1, t2) и IP-адреса, запросите, сколько URL-адресов посетил этот IP-адрес за указанный период.
Если у вас есть 10 000 пользователейтогда вы можете ожидать, что в худшем случае сканирование всех записей во временном окне приведет к тому, что потребуется только возврат в 10 000 записей, к которым обращались (в среднем).
Секунда, учитывая период времени (t1, t2) и URL-адрес, запросите, сколько раз этот URL-адрес был посещен.
В зависимости от того, сколько URL-адресов у вас в системе, например, 1000, это снова означает, что при простом сканировании получается 999 из 1000отсканированные записи не возвращаются.
Допустим, у вас есть только 100 000 уникальных URL, вы можете значительно уменьшить пространство, занимаемое базой данных (используя вместо этого внешний ключ guid / int), thтакже означает, что к вашим URL-адресам в 100-миллионных записях обращаются 1 миллион раз.
Даже при всем этом он нам ничего не говорит полностью, потому что у нас нет цифр / статистики о том, как кластеризованы по времени записи дляучитывая время поиска.Получаем ли мы 1000 запросов страниц в секунду и ищем 12-месячный временной диапазон, или мы получаем 100 запросов в секунду и ищем 1-часовой блок времени (360 000 запросов).
Предполагая, что 100 миллиардов представляют данные за 12 месяцевэто 3170 запросов в секунду.Это звучит разумно?
Почему это важно?Потому что это подчеркивает одну ключевую вещь, которую вы пропустили в своем ответе.
С записями в 100 миллиардов за последние 12 месяцев, это означает, что через 12 месяцев у вас будет 200 миллиардов записей для работы.Если 100-миллиардные записи рассчитаны на 20 лет, то это не такая проблема, вы можете ожидать, что в ближайшие 5 лет вырастет всего лишь на 25-30 млрд. ... но вряд ли ваши существующие данные превысили столь длительный период времени.
Ваше решение отвечает только одной стороне уравнения (чтение данных), вы не учитываете никаких сложностей с записью такого количества данных.В большинстве случаев вы будете вставлять данные в любое создаваемое вами хранилище данных, сможет ли оно обрабатывать постоянные запросы на вставку 3k в секунду?
Если вы вставляете записи 3k, а каждая запись - только 3x 64bitцелые числа, представляющие время (в тиках), IP-адрес и внешний ключ к URL.Тогда это всего лишь ~ 75 КБ / с записи данных, которые будет хорошо поддерживать.Если каждый URL предполагается уникальным, вы можете легко столкнуться с проблемами производительности из-за скорости ввода-вывода (игнорируя требования к пространству).
Еще одна вещь, которую интервьюер будет заинтересован в том, чтобы увидеть ваши мысли о поддержке IPv6.
Наконец, если вы предоставили такое решение, как у вас, интервьюер должен был задать дополнительный вопрос.«Как будет работать ваша система, если я теперь захочу узнать, когда конкретный IP-адрес последний раз обращался к определенному URL?»
Так что да, если вы не знаете о MapReduce и других распределенныхобрабатывая системы запросов, ваш ответ должен быть разумным.