- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Как снизить ДРР до 4,38% и повысить продажи с помощью VK Рекламы
Для интернет-магазина инженерных систем
Мария Лосева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Ребят, такая фигня:
есть таблица `teams` с полями id, name
пусть там будет 1 команда {44, superTeam}
есть таблица `matches` с полями id, enemy1, enemy2 (enemy1 и enemy2 - содержат ID команд)
пусть там будет 1 матч {1, 15, 44}
в голову приходят только 2 решения:
1. дублирование матчей (т.е. для каждого матча 2 записи, где ID команд в полях enemy1 и enemy2 местами меняются)
2. делать селект через OR (т.е. WHERE enemy1 = '$teamid' OR enemy2 = '$teamid')
такая же проблема с хранением друзей (каждую дружбу дублировать или через OR проверять)
Может есть по-лучше решение, помогите :)
Как насчет использования одного поля и функции serialize?
У нас две команды, как я понял. Создаем массив с их id, одномерный или двумерный - реализация от этого не меняется. Пусть это будет
Перед занесением в базу данных запаковываем массив в строку.
Массив принимает вид a:2:{i:0;i:15;i:1;i:44;} и именно эта строка заносится в БД.
Что касается поиска - в зависимости от количества записей. Для небольших таблиц вполне можно использовать LIKE.
Критерием поиска для 44й команды будет i:44;
Пример: SELECT * FROM `table1` WHERE `column1` LIKE '%i:44;%'
Для небольших таблиц - понятие относительное, но лично я знаю индивидуума, который использует RLIKE (съедающий еще больше ресурсов, используется для поиска по regexp) в случае с таблицей, имеющей более 150к записей :)
Вы уверены, что LIKE будет быстрее работать чем OR?
Вы уверены, что LIKE будет быстрее работать чем OR?
Вы и сами знаете ответ наверняка.
Отвечу так - я уверен, что подобным вопросом вы озаботитесь не раньше, чем количество записей в таблице станет шестизначным.
Однако я еще подумаю на эту тему, ибо всегда интересовался выбором наиболее производительного и семантически верного решения. Пока я уверен в своем решении лишь наполовину, приеду домой и проведу тесты, о результатах отпишу.
Было бы не плохо увидеть результаты тестов.
Было бы не плохо увидеть результаты тестов.
Хмм.. Результатами я озадачен:)
Заполнял таблицы на 10000 записей рандомными значениями в диапазоне от 10 до 99.
Ваша таблица состоит из трех полей - id, team1, team2 - все типа INT.
Моя - из двух полей, (INT) id и (VARCHAR[32]) teams.
Запросы в цикле for, 100 итераций.
Результаты здесь в виде простецкой сводной таблички. Столбцы забыл подписать - запросы по порядку, сначала ваш, затем мой.
А удивило меня вот что - отличий нет (я ожидал выигрыш вашего варианта в пределах 20-30%). Вероятно, надо было тестировать на 100к+ записей :)
Вопросы? Предложения?
У нас две команды, как я понял. Создаем массив с их id, одномерный или двумерный - реализация от этого не меняется. Пусть это будет
а если это будет:
?
---------- Добавлено 11.08.2012 в 20:39 ----------
2. делать селект через OR (т.е. WHERE enemy1 = '$teamid' OR enemy2 = '$teamid')
это вполне нормальное решение.
ещё может быть такая таблица:
match,team
1,15
1,44
c уникальным ключом по match+team
но автоинкремент матчей вы уже не сделаете в этой же таблице
с друзьями - тоже через ИЛИ нормально.
ещё может быть логика при которой вася друг пети, а петя не друг васи. во ВК так есть. одностороння дружба = подписчик.
а если это будет:
?
А при каких условиях, простите, это возможно, если мы в массив вносим два параметра типа INTEGER, которые являются айдишниками (праймари-ключи) из таблицы "команды"? :)
Что касается варианта с OR - ничего против него не имею, здесь его использование оправдано. Автора просил альтернативу - я предложил.
Исключительно вопрос привычки. Как оказалось, мой вариант работает ничуть не медленнее, однако его проще расширять (например, если бы в каждой игре участвовало 16 команд, разумнее использовать запаковку массива, чем создавать таблицу с 16+ полями).
Другое дело - надо ли оно? Видимо, нет.
Насчет дружбы - про подписчиков не догадался.
А вот насчет матчей - если подумать как для турниров делать селект, то скорее к предложенному варианту Dkameleon.
А при каких условиях, простите, это возможно, если мы в массив вносим два параметра типа INTEGER, которые являются айдишниками (праймари-ключи) из таблицы "команды"?
а на каких условиях, простите, неоходимо генерировать говнокод, усложняющий последующую работу? :)
ну захотели например изменить числовые индексы на строчные - по номерам команды идентифицировать стало сложно и решили присвоить им строчные коды.
Исключительно вопрос привычки. Как оказалось, мой вариант работает ничуть не медленнее, однако его проще расширять
серьёзно? :)) а как, интересно, вы джойны будете делать?
или будете рубить тремя простыми селектами?
например нужно вывести на экране названия участников первого матча. дерзайте.
а чтоб ещё интереснее - выведите турнирную таблицу и посчитайте запросы.
(например, если бы в каждой игре участвовало 16 команд, разумнее использовать запаковку массива, чем создавать таблицу с 16+ полями).
я написал выше, как можно это реализовать таблицей с двумя полями. почитайте о связях много ко многим
кстати, если у матча есть какие-то данные, кроме набора команд, то это вообще христоматический пример.
...
Окай. Спасибо, май бэд, признаю.
Даже оправдываться не буду:) Разнесли в щепки:)