Вкарване и извеждане от БД.

sentenello

Registered
Здравейте,

Въпроса ми е следния.
В БД имам таблица коята съдържа.
Код:
ид                   среща
1                  Агаси - Григор

В момента правя друга таблица която ще съдържа тв програмите по която ще предават срещата. Въпроса ми е кой е най-удобния вариант да записвам тв-тата в другата таблица.

Вариант 1:
Код:
мачид                тв
1                        бтв
1                        БНТ
1                        ТВ+
или Вариант 2:
Код:
мачаид                     тв
1                          бтв,БНТ,ТВ+

въпроса ми е, кой е по-удачния вариант, и в кой случай ще зарежда по бързо, после когато извеждам мачовете по коя програма ги предават.
 
Варянт две. Просто ще направиш един explode запетайка и ще си ги изведеш. В момента въпроса ти както си го формулирал и обяснил съдържа и отговора ти. Кое е по-добре да въртиш на един мач 10 интерации за да изведеш десет програми или една интерация на цикъла и да изведеш десетте програми наведнъж. :)
 
В случая както каза Даката втория вариант е по добре, но трябва да помислиш как ще ги използваш. Например за какво, всеки път да слагаш едни и същи телевизии за всеки мач. Не е ли по добре да си направиш една таблица с всички телевизии и после за дадения мач просто да си викаш само тези които ти трябват. Така си спестяваш постоянно записване в дадената таблица.
 
@teroristd дори не мога да си представя как ще стане това което предлагаш.

Всъщност се зачудих как ще стане заявката ако имам 3 таблици и в едната от тях телевизиите са записани както във втория ми вариант.
таблица1
Код:
ид                         среща
1                      Агаси - Григор

таблица2
Код:
мачид                  тв
1                       бтв,БНТ,ТВ+

таблица3
Код:
твид            име                озвучение
1                   бтв               български
2                   БНТ              български
3                   ТВ+              български

Каква трябва да бъде заявката, за да изведа така че да се получи

Код:
Среща                        ТВ                 Озвучение
Агаси - Григор        бтв                български
                                   БНТ               български
                                   ТВ+               български
 
Ама защо си усложняваш и утежняваш живота с трета таблица? Въвеждаш във втората още бтв-български,нова-български,....
Код:
$query = ...
while(){
$arr = explode(',',$row[tv'])';
print_r($arr);
}
Идеята е да не се мъчиш да правиш излишни конекцииии, а не да правиш допълнителни такива. :)
 
Не ме бива много по заявките, но идеята ми е например имаш таблица със 100 телевизии и ти трябват три то тях за дадения мач с ид-та например 1,7 и 99. Заявката трябва да е нещо от сорта:
Код:
$sql = "SELECT * FROM table WHERE id IN(1,7,99)'';
 
Тъй като тв-тата ще се вкарват автоматично а не лично от мене, как ще разбира какъв език е озвучението, като от там където го вземам не го пише.

Затова идеята ми беше да си направя трета таблица в която ръчно да си вкарам каналите и тяхното озвучение.
 
sentenello каза:
Тъй като тв-тата ще се вкарват автоматично а не лично от мене, как ще разбира какъв език е озвучението, като от там където го вземам не го пише.

Затова идеята ми беше да си направя трета таблица в която ръчно да си вкарам каналите и тяхното озвучение.
Та още по-лесно! При въвеждането правиш един масив с телевизиите коя с какво озвучение е и просто въвеждаш телевизията като ключ а озвучението като стойност и правиш една провека if in_array бла бла {бнт .' -'.$array['бнт']}else{бнт .' - Unknown'} и това е. Защо трябва да утежняваш с мега излишните заявки и това постоянно при рефреши да т исе зарежда от потребителя... :) На принципа на кода който ти писах преди за превежданията е :?:
 
А ако имам масив с 200 канала (БНТ => Български, БТВ => Български ) примерно, няма ли пак да е тежко за зареждане ?
 
sentenello каза:
А ако имам масив с 200 канала (БНТ => Български, БТВ => Български ) примерно, няма ли пак да е тежко за зареждане ?
Не! Спрямо SQL заявката и обработката ти създаваш масив и просто подаваш като ключ нещата. С функцията in_array() ти проверяваш дали ключът съществува и директно го викаш или още по-бързото решение:
Код:
$key = 'BNT';
if($tv = $array[$key]) {
echo $tv;
}else{
echo 'Няма съвпадение';
}
Идеята е, че ако приравниш на променливата тв масива с подаденият ключ ако той не съществува директно връща false и минаваш на еlse защото става if(false){}else{ влиза тук}. Това е в пъти по-бързо от колкото конекции и така нататък.
 
Много пъти сме говорили по тази тема. MySQL е релационна база данни, а една от основните характеристики на релацията е, че стойностите са атомарни (т.е. могат да бъдат само единични). Идеята е именно да се създават релации, за да няма дублиране на данните, т.е. първия вариант:
1. Съхраняваш срещите в таблица СРЕЩИ:ид|среща
2. Съхраняваш телевизиите в таблица ТВ:ид|тв|озвучение
3. Правиш връзката в трета таблица С-Т:ид_среща|ид_тв

[sql]SELECT `СРЕЩИ`.`среща`, `ТВ`.`тв`, `ТВ`.`озвучение`
FROM `СРЕЩИ`
LEFT JOIN `С-Т` ON `СРЕЩИ`.`ид` = `С-Т`.`ид_среща`
LEFT JOIN `ТВ` ON `С-Т`.`ид_тв` = `ТВ`.`ид`[/sql]
Резултат: среща|тв|озвучение

Аз дори бих изнесъл озвучението като външен ключ към друга таблица ОЗВУЧЕНИЕ:ид|озвучение а ТВ става ТВ:ид|тв|ид_озвучение

Дори само 2 записа да имаш за един и същ език пак ще спестиш място, а заявката ще свърши работата по-бързо, от колкото да обхождаш с цикли.

[sql]SELECT `СРЕЩИ`.`среща`, `ТВ`.`тв`, `ОЗВУЧЕНИЕ`.`озвучение`
FROM `СРЕЩИ`
LEFT JOIN `С-Т` ON `СРЕЩИ`.`ид` = `С-Т`.`ид_среща`
LEFT JOIN `ТВ` ON `С-Т`.`ид_тв` = `ТВ`.`ид`
LEFT JOIN `ОЗВУЧЕНИЕ` ON `ТВ`.`ид_озвучение` = `ОЗВУЧЕНИЕ`.`ид`[/sql]

@dakata относно "излишните" релации - ако една релация може да съществува (т.е. връзката не е one-to-one), тя няма как да е излишна. Ако не я изведеш през външен ключ ще изгубиш възможността да използваш каквито и да е групиращи функции и ще имаш дублиране на данни, а решиш ли да правиш търсене в релацията - е те тогава ще си "усложниш и утежниш живота".
 
@raiden

Това е първия вариант за който се сетих и аз да направя. Но тъй като не съм достатъчно вещ, исках мнението на вас, за да разбера кой е най-удачния вариант, за да се изпълнява кода по-бързо и да няма излишно забавяне и натоварване.

Аз дори се чудя дали да не вкарам и 4-та таблица която да съдържа информацията за всеки един канал.

Да кажем 4-та страница ще е.

Код:
idtv    tvsound           tvlink 
btv       български    btv.bg


така във втората таблица ще разбирам кой са програмите по коята ще предават срещата, а с left join ще вземам и информацията за съответните канали.

П.С. Идея си нямам дали моето мислене е правилно :D
 
teroristd каза:
Не ме бива много по заявките, но идеята ми е например имаш таблица със 100 телевизии и ти трябват три то тях за дадения мач с ид-та например 1,7 и 99. Заявката трябва да е нещо от сорта:
Код:
$sql = "SELECT * FROM table WHERE id IN(1,7,99)'';

Както казах и аз в по-горните постове по-удобно е телевизиите да са в отделна таблица. @raiden го е обяснил много добре. Единствения недостатък е че чрез заявката която е посочил имаш 1 мач - 1 телевизия, ако съм разбрал правилно :D . На теб ти трябва 1 - мач и повече телевизии евентуално. Всичко зависи от срещата. Затова ти предложих този тип заявка, като в цитата. Вече към нея си вървят всичките джойнове и тем подобни. Както казах не ме бива много по заявките :) , но идеята е ясна.
 
Може и аз да не съм разбрал правилно но, нали идеята е да се направят по малко заявки към базата :) . В първия дискутиран метод,

Код:
ид                         среща 
1                      Агаси - Григор	


таблица2 
мачид                  тв 
1                       бтв,БНТ,ТВ+

трябва за всеки мач да се прави INSERT заявка за телевизиите, докато при варианта телевизиите да са в една таблица, няма да има INSERT заявки. Така го разбирам аз.
 
teroristd каза:
Може и аз да не съм разбрал правилно но, нали идеята е да се направят по малко заявки към базата :) . В първия дискутиран метод,

Код:
ид                         среща 
1                      Агаси - Григор	


таблица2 
мачид                  тв 
1                       бтв,БНТ,ТВ+

трябва за всеки мач да се прави INSERT заявка за телевизиите, докато при варианта телевизиите да са в една таблица, няма да има INSERT заявки. Така го разбирам аз.
А защо просто не инклудва един масив и да си го обогатява ръчно. Просто ще си спести хиляди проблеми, като ползва масив и една проста if проверка. Защо е нужно да прави всичките тези магариии и да се бави и така нататък кода когато реално ако иска да добави или промени някоя програма просто е нужно да смени нещо в масива. Е да ръчно е не преминава през базата ама като го гледам той търси и скорост. При 5 заявки към 10 таблици за въвеждане после за извеждане направо стават плачевни нещата.
 
Да това също е вариант. Не знам как си е направил нещата. Ако няма админ панел и си пипа по кода през цялото време, масива е по-удачен.
 
teroristd каза:
Да това също е вариант. Не знам как си е направил нещата. Ако няма админ панел и си пипа по кода през цялото време, масива е по-удачен.
Просто от заявките които показва колегата и автор на темата, ми се струва
, че наистина повече ще забавят проверките и прескачане от ключ на ключ заявки от колкото да обработи директно масив. Ако ще и 200 телевизии да са защо да му пълнят базата само за да им сложи някакво си текстче, озвучение на български или друг език.
 
Ако правилно ви разбирам ми предлагате да си ги записвам телевизиите заедно в едно поле (бтв,БНТ,ФИЛМ+)...

И после в кода да си направя масив който ще съдържа информацията за всеки канал (написана ръчно).

Примерно
БТВ=>Български=>btv.bg,
БНТ=>Български=>bnt.bg
 
sentenello каза:
Ако правилно ви разбирам ми предлагате да си ги записвам телевизиите заедно в едно поле (бтв,БНТ,ФИЛМ+)...

И после в кода да си направя масив който ще съдържа информацията за всеки канал (написана ръчно).

Примерно
БТВ=>Български=>btv.bg,
БНТ=>Български=>bnt.bg
Почти! Направо ти предлагам още при записването да го правиш това. Тоест масива още при записването да ти въвежда:
(бтв-българско озвучение,БНТ-българско озвучение,ФИЛМ+ - английско озвучение)
После само explode запетайка и на нов ред
бтв-българско озвучение
БНТ-българско озвучение
ФИЛМ+ - английско
...
И проблема ти е решен. Къде къде по-ефективно е от работа и заявки към и във базата със селекти и прочие.
 

Back
Горе