Стани премиум член и добиј попуст на 2000+ производи и куп други бенефити!

Трета нормална форма

RagingDemon

senior
24 март 2009
6.488
5.596
За школскиот проект избравме да направиме онлајн продавница. Планирам во базата да има 4 табели и тоа Производи, Корисници, Вработени и Порачки.
Во производи ке се чуваат податоци за производите, во корисници податоци за регистрираните корисници, во вработени податоци за вработените и во порачки ке се чуваат порачките.
Е сега еден од низата услови е табелите да се нормализираат во трета нормална форма.

Дали знае некој да ми каже како да ги поделам табелите за да се во трета нормална форма? :(

Податоците во табелите се следниве:
Производи (ПроизводИД, Тип, Производител, Модел, Цена, Гаранција, Лагер, Детали)
Корисници (КорисникИД, е-маил, Лозинка, Име, Презиме)
Вработени (ВработенИД, РаботноМесто, Лозинка)
Порачки (ПорачкаИД, ПроизводИД, КорисникИД Количина, Адреса, Дата)
 

RagingDemon

senior
24 март 2009
6.488
5.596
Јас прочитав нешто набрзинка но ме буни тоа транзитивната зависност.
Кај производи нели модел-от зависи и од Тип-от освен од ПроизводИД?
 

marv

poweruser
5 октомври 2007
5.827
5.530
Јас прочитав нешто набрзинка но ме буни тоа транзитивната зависност.
Кај производи нели модел-от зависи и од Тип-от освен од ПроизводИД?

Значи во 3НФ ни еден атрибут во базата кој директно не зависи од примарниот клуч не треба да биде во таа база и треба да се издвои. Во твојот случај на пример ако имаш повеке типови кои не зависат од производид. По мене ти треба усте една табела да рецеме Типови(ТипИД, Тип), и потоа во производи наместо Тип користиш ТипИД како кадидат клуч да речеме. Истото важи и и кај вработените. Работното место не зависи директно од Вработен ИД, пошто може да има повеке вработени со исто работно место. Значи и за работно место ти треба уште една база РабМеста (РабместоИД, работно место) и соодветно менуваш во Вработени....

Мислам свати што треба да праиш понатака.:)
 

mrce

hello world
2 ноември 2009
194
34
seoblogmk.wordpress.com
@marv muabetot ti drzi i ne ti drzi voda.... ako zeme on da ja razlozuva bazata nema nigde da stigne. ke treba da kreira novi tabeli za prozivoditel, model , garancija itn itn......se zavisi od potrebite na aplikacijata...
 

RagingDemon

senior
24 март 2009
6.488
5.596
Е сеа ептен ме збунивте :)
Еден вика во 3НФ е, еден вика треба да изменеш уште нешто за да биде во 3НФ, друг вика не треба да менеш..:)
Значи апликацијата е онлајн продавница, така да треба да има сортирање по група и пребарување. Пример select * from procesori и да ги даде сите процесори, или ако во сарч некој напише AMD да излезе се што има AMD во некој атрибут.
Горе долу тоа е.
А услов е да биде во 3НФ.
 

mrce

hello world
2 ноември 2009
194
34
seoblogmk.wordpress.com
razlozi ja bazata po tvoja potreba. na primer ako poleto rabotni mesta ti igra znacajna uloga, mozes da kreiras nova tabela rabotni_mesta i da ja povrzes so tabelata vraboteni i podocna so nekoja druga tabela po potreba. isto taka i ako planiras ti da gi definiras rabotnite mesta(pr. administrator, office assistant int), pa korisnikot da izbere edna od niv, najdobro ke ti bide da gi smestis vo nova tabela. Dokolku toa pole ne ti igra nekoja vazna uloga mozes da go ostavis vo tabelata vraboteni.

e sega vo tvojot slucaj kako sto navede, procesorot ti e proizvod, a AMD ti e proizvoditel, taka da mozes poleto proizvoditel da go smestis vo nova tabela proizvoditeli, kade bi gi navel site proizvoditeli i da ja povrzes so tabelata proizvodi...
 

marv

poweruser
5 октомври 2007
5.827
5.530
razlozi ja bazata po tvoja potreba. na primer ako poleto rabotni mesta ti igra znacajna uloga, mozes da kreiras nova tabela rabotni_mesta i da ja povrzes so tabelata vraboteni i podocna so nekoja druga tabela po potreba. isto taka i ako planiras ti da gi definiras rabotnite mesta(pr. administrator, office assistant int), pa korisnikot da izbere edna od niv, najdobro ke ti bide da gi smestis vo nova tabela. Dokolku toa pole ne ti igra nekoja vazna uloga mozes da go ostavis vo tabelata vraboteni.

e sega vo tvojot slucaj kako sto navede, procesorot ti e proizvod, a AMD ti e proizvoditel, taka da mozes poleto proizvoditel da go smestis vo nova tabela proizvoditeli, kade bi gi navel site proizvoditeli i da ja povrzes so tabelata proizvodi...

Значи не е работата како јас или ти би го решиле ова практично, и што в зависност од намената и до каде ке одиме со разложување.
Човекот убаво кажа дека ова му е школски проект и УСЛОВ е базите да бидат нормализирани до 3НФ. Некој тоа ке го оценува од гледна точка на прилагоденост с стандардот, т.е. правилата за 3НФ, а не како во практика подобро би се извело. Иначе не е џабе 3НФ. Кога некад (во реална апликација) ке пораснат базите и сл. да видите колку е важно да бидат правилно нормализирани, иначе се јавува огромен оверхех на дуплицирани податоци низ базите, и проблем при упдејтирање на некој податок низ мал милион бази.
 

RagingDemon

senior
24 март 2009
6.488
5.596
Значи како што разбрав треба да го направам следново (за секоја табела посебно):

Производи (ПроизводИД, Тип, Производител, Модел, Цена, Гаранција, Лагер, Детали) - овде тип и производител не зависат дирекно од клучот бидејки може да има ист тип на производ и ист производител со различен производ ИД. Останатите се значи добри. И сега ке треба да направам две нови табели Типови (ТипИД, Тип) и Производители (ПроизводителИД, Производител). И потоа на место во тип да ставам CPU ке го ставам ТипИД, пример за CPU да биде 2.

Вработени (ВработенИД, РаботноМесто, Лозинка) - Тука треба уште една табела РаботниМеста (РаботниМестаИД, РаботноМесто) и потоа исто наместо работно место ке го ставам ИД-то за соодветното место.

Корисници (КорисникИД, е-маил, Лозинка, Име, Презиме) и Порачки (ПорачкаИД, ПроизводИД, КорисникИД Количина, Адреса, Дата) како што гледам мислам дека се добри ... или грешам?

Е сега да прашам, како да ги поврзам табелите за пребарување? Предходно беше лесно, SELECT *
FROM `proizvodi`
WHERE `tip` LIKE '$string'
OR `proizvoditel` LIKE '$string'
OR `specifikacija` LIKE '$string' каде што $string е внесениот збор од корисникот што пребарува, AMD на пример и му излегуваат сите производи што го содржат зборот AMD.
Знам дека можеби звучи глупо прашањето, ама прв пат го правам ова :)
 

marv

poweruser
5 октомври 2007
5.827
5.530
Значи како што разбрав треба да го направам следново (за секоја табела посебно):

Производи (ПроизводИД, Тип, Производител, Модел, Цена, Гаранција, Лагер, Детали) - овде тип и производител не зависат дирекно од клучот бидејки може да има ист тип на производ и ист производител со различен производ ИД. Останатите се значи добри. И сега ке треба да направам две нови табели Типови (ТипИД, Тип) и Производители (ПроизводителИД, Производител). И потоа на место во тип да ставам CPU ке го ставам ТипИД, пример за CPU да биде 2.

Вработени (ВработенИД, РаботноМесто, Лозинка) - Тука треба уште една табела РаботниМеста (РаботниМестаИД, РаботноМесто) и потоа исто наместо работно место ке го ставам ИД-то за соодветното место.

Корисници (КорисникИД, е-маил, Лозинка, Име, Презиме) и Порачки (ПорачкаИД, ПроизводИД, КорисникИД Количина, Адреса, Дата) како што гледам мислам дека се добри ... или грешам?

Е сега да прашам, како да ги поврзам табелите за пребарување? Предходно беше лесно, SELECT *
FROM `proizvodi`
WHERE `tip` LIKE '$string'
OR `proizvoditel` LIKE '$string'
OR `specifikacija` LIKE '$string' каде што $string е внесениот збор од корисникот што пребарува, AMD на пример и му излегуваат сите производи што го содржат зборот AMD.
Знам дека можеби звучи глупо прашањето, ама прв пат го правам ова :)

За 1. и 2. ДА така е .Си сватил :) Спојувањето се прави со Select..... JOIN ..... ON ... Значи седни прочитај малце за SQL да не ја разводнуеме сега работава овде.
 

RagingDemon

senior
24 март 2009
6.488
5.596
Абе другар, не е проблем да седнам да прочитам, ама кус сум со време. :) Тоа поопширно ке го прочитам кога ке ми завршат колоквиумите и испитите.
Инаку, овој проект е по предметот PHP програмирање, така да професорот кажа дека ке му бидат побитни PHP кодовите, не SQL и HTML, но кога веке ставил услов да бидат во 3НФ си викам дај да ги направам барем како што рекол.
Значи 1 и 2 е добро, а ме оставаш да мислам за 3 и 4 :). Епа по мое јас мислам дека кај Корисници табелата ке треба да направам уште една табела со ИД, име и презиме, затоа што е можно два корисници со исто име и/или презиме да имаат различен ИД. Така да име и презиме не зависат дирекно од КорисникИД.
Кај табелата Порачки (ПорачкаИД, ПроизводИД, КорисникИД Количина, Адреса, Дата) ПроизводИД и КорисникИД мислам дека треба да се издвојат бидејки еден производ може да се најде во повеке порачки и еден корисник може да направи повеке порачки, но не знам каква нова табела да направам бидејки тие се веке ИД :)

И сега за проба ги направив табеливе

proizvodi:

proizvodi.jpg


Proizvoditeli:

proizvodit.jpg


и tipovi:

tipovi.jpg


И сега кога сакам да ја печатам табелата производи тоа го правам со овој код:

PHP:
mysql_query("SELECT * 
FROM  `proizvodi` ");

и овој код ми го врака следново:

2011011294069126.jpg


Е сега, со кој код да направам наместо tipid и proizvoditelid да ми ги врака соодветните тип и производител. На пример наместо за првиот ред да ми врака:

1 1 1 Phenom II X6 1075T 13000 6, да врака:

1 procesor AMD Phenom II X6 1075T 13000 6.
 

Trooper

read-only
24 февруари 2010
15
5
Абе другар, не е проблем да седнам да прочитам, ама кус сум со време. :) Тоа поопширно ке го прочитам кога ке ми завршат колоквиумите и испитите.
Инаку, овој проект е по предметот PHP програмирање, така да професорот кажа дека ке му бидат побитни PHP кодовите, не SQL и HTML, но кога веке ставил услов да бидат во 3НФ си викам дај да ги направам барем како што рекол.
Значи 1 и 2 е добро, а ме оставаш да мислам за 3 и 4 :). Епа по мое јас мислам дека кај Корисници табелата ке треба да направам уште една табела со ИД, име и презиме, затоа што е можно два корисници со исто име и/или презиме да имаат различен ИД. Така да име и презиме не зависат дирекно од КорисникИД.
Кај табелата Порачки (ПорачкаИД, ПроизводИД, КорисникИД Количина, Адреса, Дата) ПроизводИД и КорисникИД мислам дека треба да се издвојат бидејки еден производ може да се најде во повеке порачки и еден корисник може да направи повеке порачки, но не знам каква нова табела да направам бидејки тие се веке ИД :)

И сега за проба ги направив табеливе

proizvodi:

proizvodi.jpg


Proizvoditeli:

proizvodit.jpg


и tipovi:

tipovi.jpg


И сега кога сакам да ја печатам табелата производи тоа го правам со овој код:

PHP:
mysql_query("SELECT * 
FROM  `proizvodi` ");

и овој код ми го врака следново:

2011011294069126.jpg


Е сега, со кој код да направам наместо tipid и proizvoditelid да ми ги врака соодветните тип и производител. На пример наместо за првиот ред да ми врака:

1 1 1 Phenom II X6 1075T 13000 6, да врака:

1 procesor AMD Phenom II X6 1075T 13000 6.

Еве пример со JOIN на табелите
Код:
SELECT Proizvoditeli.proizvoditel,Tipovi.tip,Proizvodi.model,Proizvodi.cena,
Proizvodi.garancija FROM Proizvodi JOIN Proizvoditeli ON 
Proizvoditeli.proizvoditelid = Proizvodi.proizvoditelid JOIN Tipovi ON  
Tipovi.tipid = Proizvodi.tipid
 

marv

poweruser
5 октомври 2007
5.827
5.530
Абе другар, не е проблем да седнам да прочитам, ама кус сум со време. :) Тоа поопширно ке го прочитам кога ке ми завршат колоквиумите и испитите.
Инаку, овој проект е по предметот PHP програмирање, така да професорот кажа дека ке му бидат побитни PHP кодовите, не SQL и HTML, но кога веке ставил услов да бидат во 3НФ си викам дај да ги направам барем како што рекол.
Значи 1 и 2 е добро, а ме оставаш да мислам за 3 и 4 :). Епа по мое јас мислам дека кај Корисници табелата ке треба да направам уште една табела со ИД, име и презиме, затоа што е можно два корисници со исто име и/или презиме да имаат различен ИД. Така да име и презиме не зависат дирекно од КорисникИД.
Кај табелата Порачки (ПорачкаИД, ПроизводИД, КорисникИД Количина, Адреса, Дата) ПроизводИД и КорисникИД мислам дека треба да се издвојат бидејки еден производ може да се најде во повеке порачки и еден корисник може да направи повеке порачки, но не знам каква нова табела да направам бидејки тие се веке ИД :)

Ете за Select-от ме претркаа. Што се однесува до Порачки табелата ОК е. Не треба да ги вадиш надвор ПроизбодИД и КОрисник ИД. 3НФ вика атрибутите кои не зависат од клучевите да небидат у таа табела, а не и останатите клучеви. Остај како е супер ти е. Иначе тоа што си го направил за Корисник табелата е дискутабилно. Самото тоа што може да има 2 корисника со исто име и презиме незначи дека не е задоволен условот. Можеби навистина има двајца Петко Петковски да речеме. Јас би ги оставил дабелите како ги дискутиравме предходно и да си немаш гајле.:)
 

RagingDemon

senior
24 март 2009
6.488
5.596
И јас би играл така, некако глупо ми звучи правење на табела само со име и презиме :)

Е сега уште да прашам дали мора со Join да ги вадам податоците, затоа што и следниов код ми врши работа:

SELECT proizvodi.proizvodid, tipovi.tip, proizvoditeli.proizvoditel, proizvodi.model, proizvodi.cena, proizvodi.garancija
FROM `proizvodi`, `tipovi`, `proizvoditeli`
WHERE
proizvodi.proizvoditelid = proizvoditeli.proizvoditelid AND
proizvodi.tipid = tipovi.tipid
 

marv

poweruser
5 октомври 2007
5.827
5.530
И јас би играл така, некако глупо ми звучи правење на табела само со име и презиме :)

Е сега уште да прашам дали мора со Join да ги вадам податоците, затоа што и следниов код ми врши работа:

SELECT proizvodi.proizvodid, tipovi.tip, proizvoditeli.proizvoditel, proizvodi.model, proizvodi.cena, proizvodi.garancija
FROM `proizvodi`, `tipovi`, `proizvoditeli`
WHERE
proizvodi.proizvoditelid = proizvoditeli.proizvoditelid AND
proizvodi.tipid = tipovi.tipid

Во твојов случај можеш како сакаш, бидејки и твојата команда со WHERE всушност е еден тип на JOIN т.е. INNER JOIN. Ама само во оној случај. Има ситуации каде неможеш се да завршиш со просто селектирање и потоа филтрирање со WHERE.
 

RagingDemon

senior
24 март 2009
6.488
5.596
Значи штом ми врши работа, добро е :)
Фала на сите, посебно на марв, многу ми помогна. Ако ми излезе уште некој проблем ке пишам пак.
 

RagingDemon

senior
24 март 2009
6.488
5.596
Да прашам уште нешто, сега во базата во phpMyAdmin во табелата Производи (ПроизводИД, ТипИД, ПроизводителИД, Модел, Цена, Гаранција, Лагер, Линк), ПроизводИД е примарен за таа табела. Сакам да прашам дали во истата табела и ТипИД и ПроизводителИД да ги направам примарни? Бидејки и тие се примарни во својата соодветна табела.
 

username

lurker
4 јули 2009
526
67
Не, во една табела има само еден примарен клуч, а во секоја од табелите стави по еден примарен клуч, поточно стави ги како примарен онаа колона која што ја именуваш по табелата.
На пример, колона производителИД стави ја примарен во табела производители. и така натаму
 

Fiasco

poweruser
2 март 2008
3.036
203
404
www.igorjanevski.com
Сакам да прашам дали во истата табела и ТипИД и ПроизводителИД да ги направам примарни? Бидејки и тие се примарни во својата соодветна табела.

Tиe тиe сe foreign клучови во табeлата Производи, нeмаш потрeба од композитeн примарeн клуч.
 
членови онлајн
мислења
теми
членови

Нови мислења

Последни огласи

ИТ маркет

На врв Дно