|
|
|
|
|
для: Axxil
(30.04.2008 в 09:47)
| | понятно, ну то что там целочисленные значения будут то это однозначно, спасибо, буду изучать эту тему) | |
|
|
|
|
|
|
|
для: web777
(30.04.2008 в 06:25)
| | Ну можно забабахать индексы на id_country и id_region . Ну а так столбцы id_* целочисленные и выборка в них осуществляется очень быстро.
Да и с типом полей id_* не перебарщивайте. Обычно, начинающие, фигачат везде int(11) хотя понятно, что нет в мире миллиарда стран, да и регионов вряд ли столько будет. Поэтому для стран и регионов вполне подойдёт тип tinyint(3), для городов int(6) | |
|
|
|
|
|
|
|
для: Axxil
(29.04.2008 в 15:51)
| | хотя да, верно, я не подумал что много мусора получится. Тут думал что в будущем возможно получится избежать лишних запросов, мало ли, может какиенибудь понадобятся, к примеру определить ID страны или региона по городу, или еще что нибудь, но теперь понял что лутше сделать один лишний запрос чем хранить столько мусора постоянно.
Ну теперь понятно, буду разбираться в этом направлении, за помощь спасибо большое)
кстати вот еще что хотел спросить, тут слышал что проставления индексов тоже играет большую роль н производительность, в даном случаи если структура таблице городов будет такой как ниже, то на какие поля нужно сделать индексы и на все ли эти таблицы требуется ?
Страны:
id_country | name
Регионы:
id_region | id_country | name
Города
id_city | id_region | name
|
| |
|
|
|
|
|
|
|
для: web777
(29.04.2008 в 13:38)
| | JOIN позволяет избежать избыточности.
Вот смотри. Сделаешь ты, скажем, одну таблицу с тремя полями города, региона и страны.
И теперь при каждом добавлении города надо добавлять и страну и регион.
И теперь прикинь сколько городов в России, например в Московской области. И ты будешь для каждого города добавлять одни и те же поля страны и региона? И получишь таблицу такого объёма, что у тебя база сломается даже на самом просто запросе.
MySQL очень грамотно объединяет таблицы, если они правильно нормированы. | |
|
|
|
|
|
|
|
для: Axxil
(29.04.2008 в 12:35)
| | насчет кэширования мне еще далеко, пока с этим бы справится)
вообще я хотел написать универсальный скрипт по городам,регионам и странам, который можно было применить на любую тематику проекта, это может и объявления и автопортал, автосалоны, недвижимость, строительство и т.п. где можно применить города.
И такой еще вопрос, если не трудно, что если изменить структуру таблицы(для объявлений) где было одно поле "city" а теперь сделать с тремя полями: country, region, city и потом по ним делать выборку
но это для того чтобы потом при выборке не использовать кучу JOIN, т.к. не известно какие еще запросы придется делать. Но в тоже время использовать структуру хранения Городов как выше посоветовал "один ко многим". Как думаешь, лутше будет чем использовать JOIN ? | |
|
|
|
|
|
|
|
для: web777
(29.04.2008 в 11:35)
| | Основная польза баз данных как раз и заключается в возможности таких объединений (один ко многим, многие ко многим). И если грамотно использовать индексы, то проблемы с производительностью начнутся очень нескоро. А при наличии сколь-нибудь существенной нагрузки проще докупить доп. сервер, чем оптимизировать каждый байт. (Хотя определённую оптимизацию всё равно надо проводить). А если поставить кеширующую систему, типа memcache, то нагрузку на БД можно будет очень прилично уменьшить (всё зависит от степени "динамизма" сайта).
Но это всё отдалённые перспективы, а пока проект маленький можно не париться за нагрузку, если база грамотно спроектирована.
Подсчёт обычно ведётся в реальном времени при каждом запросе. Т.е например полное количество объявлений из одного города:
'SELECT count(id_ad) AS cnt FROM ad_table WHERE id_city = '.$id_city;
|
| |
|
|
|
|
|
|
|
для: Axxil
(29.04.2008 в 11:03)
| | спасибо огромное, буду изучать, но я слышал что вроде с JOIN много злоупотреблять нельзя, т.к они много в себе несут нагрузку на БД, так ли это?
да и ещё, если можно конечно, как обычно делается подсчет на кол-во записей, у меня также имеется неограниченная структура разделов через Parent, обычно два-три уровня используется не больше, как можно подсчитать при выборе определенного Города, Региона или Страны, колько записей находится в разделах?
на сайте avtodoska .ru там сразу видно, при выборе города, сразу ведется подсчет записей для каждого раздела, вроде как я понимаю тут заранее не сохранишь счетчик под каждый город, т.к городов очень много, поэтому тут я пологаю нужно почитывать постоянно(без сохранения) при каждом обращении.
как обычно с этим делом справляются? буду очень признателен | |
|
|
|
|
|
|
|
для: web777
(29.04.2008 в 10:58)
| | Если по конкретному региону то:
SELECT t1.ad,t1.title,t1.content,t2.name as city_name
FROM ad_table t1
LEFT JOIN city_table t2 ON t2.id_city = t1.id_city
WHERE t2.id_region='.$id_region;
|
По стране (нужно присоединить таблицу с регионами):
SELECT t1.ad,t1.title,t1.content,t2.name as city_name
FROM ad_table t1
LEFT JOIN city_table t2 ON t2.id_city = t1.id_city
LEFT JOIN region_table t3 ON t3.id_region = t2.id_region
WHERE t3.id_country='.$id_country;
|
| |
|
|
|
|
|
|
|
для: Axxil
(29.04.2008 в 10:48)
| | хм, интересно, надо будет почитать про JOIN, но это если по все записям и с выводом названия города, а что если допустим нужно сделать выборку только по Региону какой запрос должен быть? и какой запрос если выбрать нужно будет по Стране или отдельно по Городу? | |
|
|
|
|
|
|
|
для: web777
(29.04.2008 в 10:30)
| | Таблица с объявлениями моет иметь примерно такую структуру:
id_ad id_city title content
Теперь, если нам надо, например вытащить все объявления и добавить название города то пишем простой запрос:
SELECT t1.ad,t1.title,t1.content,t2.name as city_name
FROM ad_table t1
LEFT JOIN city_table t2 ON t2.id_city = t1.id_city
|
И всё, без всяких дополнительных функций. | |
|
|
|
|