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

Xenus

Новичок
Выслали тестовое задание мне. Я его сделал, через полдня мне ответ что по итогам тестового задания со мной даже разговаривать не будут на собеседовании, причины не объяснили. Тестовое задание и мои решения привожу здесь. Может мне тут кто-нибудь разъяснит в чем я прокололся так сильно.

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
2. Перечислите все возможные способы выставления cookie клиенту в PHP?
Мой ответ: setrawcookie, setcookie(), напрямую отправить через header()

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

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

Мой ответ: Примерно такое: '|^(?:http://)([^/]+)|i

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])

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

Мой ответ: В таком случае можно организовать отдельные хранилища на каждом сервере, куда будут попадать количества просмотров за последние 10 минут. Раз в 10 минут скрипт на Master сервере может собирать эту статистику с других серверов, складывать и записывать данные в свою БД, после этого данные о посещениях на других серверах обнуляются. Хранилище можно организовать с помощью какого-либо NOSQL решения (предпочтительно), либо файлами, в общем зависит от возможностей сервера.
 

vasinsky

Новичок
Я не очень хорошую теоретическую подготовку имею
зачётно себя подставил)


Мой ответ: Второй вариант предпочтительнее, т.к. в данном случае поиск по массиву можно осуществлять по ключам массива, что как правило быстрее чем в первом случае, где нужно будет совершать поиск по всем значениям массива. Третий вариант вовсе не массив, а строка, поиск нужно осуществлять по строке, что гораздо медленнее поиска в массиве, к тому же изменение данных в строке (если понадобится) будет сделать гораздо сложнее.
ИМХО - я бы использовал 1й вариант - массив бы получил сразу из БД и проверял бы с in_array()
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Если это было на джуниора собеседование, то в принципе, норм ответы. Не ахти, но тем не менее.
 

Xenus

Новичок
Если это было на джуниора собеседование, то в принципе, норм ответы. Не ахти, но тем не менее.
Ну а подробнее, если можно?) Ну да, с О-нотацией конечно у меня есть пробелы, но в остальном не пойму. Это было не собеседование, сами нашли мое резюме и отослали тестовое задание, я им прислал этот вариант, они ответили что даже приглашать на собеседование меня не будут, т.к. задание я провалил. Вакансия НЕ джуниора.
 

vasinsky

Новичок
Xenus, предлагают 3 варианта : одномерный массив, двумерный и строка

со строкой - регуляркой - не ахти

но если выбирать между одномерным и двумерным - ответ наверное сразу понятен ?
 

Xenus

Новичок
но если выбирать между одномерным и двумерным - ответ наверное сразу понятен ?
Поиск по ключу в двумерном массиве будет явно быстрее чем поиск по значениям в одномерном массиве.
Я вам дал выше ссылку на stackoverflow там как раз обсуждается этот вопрос как хранить данные в массиве.
 

vasinsky

Новичок
Xenus, чё мне ссылки на какие то топики))

1. одномерный массив - он меньше в памяти займёт -= чём двумерный - согласен?
2.
Поиск по ключу в двумерном массиве будет явно быстрее
тесты проводили?
 

флоппик

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

Про strlen правильный ответ O(1), то есть, не зависит от длины самой строки, т.к. размер строки хранится вместе со строкой.

Последний вопрос комментировать не буду.

Впрочем, расстраиваться что не попал на работу в компанию, у которой таблицы в cp1251 не стоит. :)
 

vasinsky

Новичок
PHP:
$start = microtime(1);

for($i=0; $i<10000; $i++){
   $str = 'q';
   $array = array('a','z','f','q');
   $t=in_array($str, $array);
}

echo microtime(1)-$start;
Результат: 0.012647151947021
PHP:
$start = microtime(1);

for($i=0; $i<10000; $i++){
  $str = 'q';
  $array = array('a'=>true,'z'=>true,'f'=>true,'q'=>true);
  $t=array_search($str, $array);

}
echo microtime(1)-$start;
Результат: 0.0091698169708252

PHP:
$start = microtime(1);

for($i=0; $i<10000; $i++){
  $str = 'q';
  $array = array('a'=>true,'z'=>true,'f'=>true,'q'=>true);
  $t=array_key_exists($str, $array);

}

echo microtime(1)-$start;
Результат: 0.0089399814605713


Победил array_key_exists()

но я всё равно не вижу смысла в многомерным массивом


у которой таблицы в cp1251 не стоит
таки да ))
 

Xenus

Новичок
Только в вопросе ни слова про массивы, а про noSQL. Правильный ответ скорее всего, первый.
Про strlen правильный ответ O(1), то есть, не зависит от длины самой строки, т.к. размер строки хранится вместе со строкой.
Последний вопрос комментировать не буду.
Впрочем, расстраиваться что не попал на работу в компанию, у которой таблицы в cp1251 не стоит. :)
Почему ни слова про массивы, написано "входит ли произвольно указанный идентификатор в этот массив". Я как понимаю массив будем хранить в nosql после сериализации.
Про О-нотацию, спасибо, буду знать)
Почему последний не будете комментировать? Я бы очень хотел чтобы вы прокомментировали.
Да я то не расстраиваюсь, просто обидно когда вот так отшивают без объяснения причин. Про cp1251 меня тоже удивило кстати, но я не стал ничего писать)
 

Xenus

Новичок
но я всё равно не вижу смысла в многомерным массивом
Смысл тут еще в том, что когда нужно удалить значение userId нам не нужно будет разыскивать элемент массива, а просто сделать unset($userIds["userId"]), когда нужно добавить элемент, то не нужно искать уже наличие его, т.к. будет избыточная информация в массиве, а просто сделать $userIds["userId"]=true, и если ключ уже имеется в массиве то он не появится второй раз
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Почему ни слова про массивы, написано "входит ли произвольно указанный идентификатор в этот массив". Я как понимаю массив будем хранить в nosql после сериализации.
Потому что вопрос о том, как лучше хранить в noSQL для последующего поиска. Если бы задача не стояла про noSQL, его бы просто не стали упоминать, вот и все. Массив - это общий термин, не связанный только с массивами в пхп.

На последний вопрос нет правильного ответа, потому что он очень сильно зависит от конкретной ситуации. Из вариантов есть например, с парсингом аксесс логов, например. Или с общим мемкешем, из которого переодически сливается в мастер. Или ndb.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Смысл тут еще в том, что когда нужно удалить значение userId нам не нужно будет разыскивать элемент массива, а просто сделать unset($userIds["userId"]), когда нужно добавить элемент, то не нужно искать уже наличие его, т.к. будет избыточная информация в массиве, а просто сделать $userIds["userId"]=true, и если ключ уже имеется в массиве то он не появится второй раз
Вот не домысливай. Нет в задаче ничего про "нужно будет удалить значение userid". Это ты сам придумал.
 

Xenus

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

Xenus

Новичок
Потому что вопрос о том, как лучше хранить в noSQL для последующего поиска. Если бы задача не стояла про noSQL, его бы просто не стали упоминать, вот и все. Массив - это общий термин, не связанный только с массивами в пхп.
Я тут вижу синтаксис переменных и массивов PHP. Для чего было упомянуто noSQL, понятия не имею, может быть для "реалистичности" задачи или еще чего. В любом случае вариант либо 1 либо 2, я предпочел 2-й, но тут тоже все неоднозначно. Я не считаю что на этот вопрос я ответил неправильно, разве что его дополнить можно))
 

Lionishy

Новичок
Xenus, в вопросе про noSQL Вас, вероятнее всего, спрашивают: какого типа базу noSQL Вы бы предпочли для предложенной задачи. А массивы PHP тут вообще ни при чём.

А разговаривать не стали с Вами, потому что там сидят девочки HR, которые просто сверяют Ваши ответы с таблицей. И что Вы там комментируете их не волнует. Это бы сыграло в том случае, если бы Вы уже встретились с team-leader.
 
Сверху