Сделал тестовое задание, объясните пожалуйста что не так

Xenus

Новичок
в вопросе про noSQL Вас, вероятнее всего, спрашивают: какого типа базу noSQL Вы бы предпочли для предложенной задачи. А массивы PHP тут вообще ни при чём.
Сомнительно, они предлагают три варианта формата хранения данных на выбор и вопрос звучит "В каком формате вы сохраните данные?". Причем именно array() и переменные PHP. Какой тип noSQL в этом вопросе особо не важно, иначе они бы и спросили тип хранилища.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Нормально вопрос написан, в каком виде хранить в noSQL. Ты начал про пхп-массивы рассказывать. Можно конечно придумывать разные оправдания, но умение нормально интерпретировать вопрос без левой отсебятины, и есть основное качество хорошего работника.
 

hell0w0rd

Продвинутый новичок
Xenus, другими словами, ты бы каждый раз заргружал данные из хранилища и в уже в php их фильтровал?
 

Xenus

Новичок
Нормально вопрос написан, в каком виде хранить в noSQL. Ты начал про пхп-массивы рассказывать. Можно конечно придумывать разные оправдания, но умение нормально интерпретировать вопрос без левой отсебятины, и есть основное качество хорошего работника.
Возможно вы правы, я неправильно понял вопрос, особенно когда увидел PHP код и прочел "Каким образом вы будете проверять вхождение (пример PHP кода)?" я подумал что тут речь именно о коде. ИМХО все таки вопрос немного некорректно поставлен если они хотели спросить именно про nosql.
 

hell0w0rd

Продвинутый новичок
Xenus, тут и вылазит ваше незнаение nosql. Я, например, тоже не особо nosql знаю, но понятно, что есть инструменты, как sql в рсубд, позволяющие сделать выборку. Вы же не будете всех пользователей из sql базы грузить?)
 

флоппик

promotor fidei
Команда форума
Партнер клуба
а что такого страшно неподьемного в noSQL для джуна? Или принцип работы мастер-слейв сложно? Вот знание паттернов - это еще какая-никакая теория, что там мало быть джуном, кмк.
 

Xenus

Новичок
Xenus, тут и вылазит ваше незнаение nosql. Я, например, тоже не особо nosql знаю, но понятно, что есть инструменты, как sql в рсубд, позволяющие сделать выборку. Вы же не будете всех пользователей из sql базы грузить?)
Ну да, только не из всех типов nosql можно делать подобную выборку.
 

Breeze

goshogun
Команда форума
Партнер клуба
Xenus, тут и вылазит ваше незнаение nosql. Я, например, тоже не особо nosql знаю, но понятно, что есть инструменты, как sql в рсубд, позволяющие сделать выборку. Вы же не будете всех пользователей из sql базы грузить?)
ответ на вопрос без указания конкретного хранилища будет выглядеть так: для хранения в любом nosql подойдет любой вариант хранения.
потому что nosql сам по себе массив с ключами
 

MiksIr

miksir@home:~$
а что такого страшно неподьемного в noSQL для джуна? Или принцип работы мастер-слейв сложно? Вот знание паттернов - это еще какая-никакая теория, что там мало быть джуном, кмк.
А его не спрашивают "что такое noSQL" или "что такое мастер-слейв". Спрашивают архитектурные решения. Возможно, не сложные, но юниор - это жамшут. Про паттерны то там вопрос как раз на голое знание. Выучить можно и ответить ни разу не применяя. Вот, к слову
Только в вопросе ни слова про массивы, а про noSQL. Правильный ответ скорее всего, первый.
Вот это array(userId1, userId2, userId3, ...) хорошо когда в noSQL есть средства проверки вхождения и есть средства построения индекса.
array(userId1 => true, userId2 => true, userId3 => true, ...) - вот это скорее всего всегда, ибо в key-value сторадже скорее всего заложены средства быстрой выборки по ключу.
Такие рассуждения - это все же не джун, имхо.
 

Breeze

goshogun
Команда форума
Партнер клуба
но если выбирать между одномерным и двумерным - ответ наверное сразу понятен ?
но если выбирать между одномерным и двумерным - ответ наверное сразу понятен ?
предлагают одномерный и одномерный. с поиском по значению и с поиском по ключу.
тут и без тестов понятно что быстрее, тут вопрос в том, что ожидают услышать.
 

vasinsky

Новичок
предлагают одномерный и одномерный. с поиском по значению и с поиском по ключу.
это и ежё понятно.

но если представить что пользователей 1 000 000 и учесть что двумерный массив в 2 (а может и более) раз больше места в памяти будет занимать ? что тогда выбрать?
 

Breeze

goshogun
Команда форума
Партнер клуба
это и ежё понятно.

но если представить что пользователей 1 000 000 и учесть что двумерный массив в 2 (а может и более) раз больше места в памяти будет занимать ? что тогда выбрать?
где ты увидел двумерный массив?
ты реально думаешь, что int-ключ=>bool-значение будет в 2 раза в большую сторону отличаться от int-ключ=>int-значение?
 

AnrDaemon

Продвинутый новичок
1. В БД MySQL есть 2 таблицы (фотографии и комментарии к ним):

CREATE TABLE `photos` (
`photo_id` int(11) NOT NULL,
`photo_title` tinytext NOT NULL,
PRIMARY KEY (`photo_id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;

CREATE TABLE `comments` (
`comment_id` int(11) NOT NULL AUTO_INCREMENT,
`photo_id` int(11) unsigned NOT NULL,
`user_id` int(11) unsigned NOT NULL,
`comment_text` text NOT NULL,
PRIMARY KEY (`comment_id`)
) ENGINE=InnoDB DEFAULT CHARSET=cp1251;

Напишите SQL-запрос, который выведет список фотографий, с указанием количества комментариев, отсортированные в порядке убывания их количества, у которых меньше 5 пользователей-комментаторов.

Мой ответ:
Код:
SELECT photos.photo_id, count(comments.photo_id) as comments_count
FROM photos
JOIN comments ON photos.photo_id=comments.photo_id

GROUP BY photos.photo_id
HAVING COUNT(DISTINCT comments.user_id)<5
ORDER BY comments_count DESC
Тут совершенно точно не прокатит. У тебя нет никакого условия на выборку, разультатом запроса будет ПОЛНЫЙ ДАМП ОБЕИХ ТАБЛИЦ.
HAVING обрабатывается после выборки, уже по готовым результатам, перед тем, как отдать их пользователю.
И count(*) в MySQL работает быстрее, чем count(`column`). Это просто надо знать.

2. Перечислите все возможные способы выставления cookie клиенту в PHP?
Мой ответ: setrawcookie, setcookie(), напрямую отправить через header()
Тут, вероятно, верно. Если за время моего отсутствия не придумали ничего нового.

3. Какова алгоритмическая сложность (в О-нотации) функции strlen($s) в PHP? Прокомментируйте свой ответ.
Мой ответ:Я не очень хорошую теоретическую подготовку имею, поэтому могу сказать что по моему алгоритмическая сложность данной функции является зависимостью от длины строки $s
Уже по одной только формулировке ответа я бы не стал приглашать на собеседование. Независимо от правильности ответа. Если человек не владеет родным языком, он не в состоянии писать нормальный код на чужих языках.
(Правильный ответ, как сказали выше, O(1) для строк в PHP.)

4. Имеется переменная $url содержащая адрес веб-страницы и вызов preg_match($regexp, $url, $matches). Какое значение переменной $regexp приведет к тому, что в $matches будет 2 элемента, причем второй элемент будет содержать только домен?

Мой ответ: Примерно такое: '|^(?:http://)([^/] )|i
Тихий ужас. Во-первых пайп сложно различить во многих шрифтах, во-вторых - дикий монстр.
Сравни с '#^(https?://)(\w+(?:[.-]\w+)+)#' (читаем http://tools.ietf.org/html/rfc1101 и http://tools.ietf.org/html/rfc952 )

5. Какой паттерн по смыслу ближе всего к принципу действия «триггеров» в базе данных? Прокомментируйте свой ответ.
singleton
abstractfactory
observer
adapter
decorator
Мой ответ: Паттерн observer, т.к. он тут единственный паттерн поведения, суть которого в возможности изменять свойства одного зависимого объекта при изменении другого. Примерно так же действуют триггеры, позволяя выполнять какое-либо действие при изменении таблицы.
6. Вам нужно хранить большой массив идентификаторов пользователей в noSQL хранилище. А потом проверять входит ли произвольно указанный идентификатор в этот массив. В каком формате вы сохраните данные?
$userIds = array(userId1, userId2, userId3, ...)
или
$userIds = array(userId1 => true, userId2 => true, userId3 => true, ...)
или
$userIds = "userId1,userId2,userId3,..."
или другой вариант

В чем плюсы/минусы каждого из форматов? Каким образом вы будете проверять вхождение (пример PHP кода)?

Мой ответ: Второй вариант предпочтительнее, т.к. в данном случае поиск по массиву можно осуществлять по ключам массива, что как правило быстрее чем в первом случае, где нужно будет совершать поиск по всем значениям массива. Третий вариант вовсе не массив, а строка, поиск нужно осуществлять по строке, что гораздо медленнее поиска в массиве, к тому же изменение данных в строке (если понадобится) будет сделать гораздо сложнее.
$hasUser = array_key_exists($userId,$userIds ); или isset(userIds[$userId])
Причём isset НАМНОГО быстрее, чем array_key_exists.
Вообще, если не стоит задача поиска ключей с NULL значением, использовать array_key_exists нет смысла.
И, да, массив array(userid => true) - одномерный.

7. Есть новостной сайт, с нагрузкой до 20000 запросов в минуту. Запросы равномерно распределяются по 5 серверам приложений. Данные хранятся на отдельном MySQL сервере, а на каждом сервере приложений поднят MySQL и между ними настроена Master-slave репликация. Необходимо собирать статистику по количеству просмотров каждой новостной статьи (шаг - 10 минут) и выводить ее в панели управления. Нужно учитывать, что при просмотре статьи происходит обращение только к локальному серверу БД. Опишите как бы вы подошли к решению данной задачи.
Мой ответ: В таком случае можно организовать отдельные хранилища на каждом сервере, куда будут попадать количества просмотров за последние 10 минут. Раз в 10 минут скрипт на Master сервере может собирать эту статистику с других серверов, складывать и записывать данные в свою БД, после этого данные о посещениях на других серверах обнуляются. Хранилище можно организовать с помощью какого-либо NOSQL решения (предпочтительно), либо файлами, в общем зависит от возможностей сервера.
Тысячи возможных решений. Зависит от общей архитектуры. Примерно сотня из них годится почти для любой. Из них десяток могут даже подойти как верный ответ. Но какое именно имел в виду составитель этого теста - хрен угадаешь.
 

fixxxer

К.О.
Партнер клуба
3) ответ гуглится по "php strlen complexity" за 5 секунд
6) рассуждения про php-функции неприменимы, ожидается ответ на примере конкретных nosql (даже если не работал - берешь ман монги и смотришь)
7) неплохо бы побольше вариантов и оценки их применимости. Фраза "возможности сервера" выдает новичка.

Впрочем, если это действительно фотострана - радуйся, что не взяли.
 
Сверху