1. Здраво и добредојдовте на форумот на IT.mk.

    Доколку сеуште не сте дел од најголемата заедница на ИТ професионалци и ентузијасти во Македонија, можете бесплатно да се - процесот нема да ви одземе повеќе од 2-3 минути, а за полесна регистрација овозможивме и регистрирање со Facebook и Steam.
    Сокриј

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

Дискусија во форумот 'Microsoft SQL Server, MySQL, PostgreSQL, Oracle, S' започната од RagingDemon, 29 Декември 2010.

  1. RagingDemon

    RagingDemon
    Unbeatable

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

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

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

    RagingDemon
    Unbeatable

    6,332
    5,247
    24 Март 2009
    Машко
  3. Alexandar

    Alexandar
    Gaining Experience

    2,514
    90
    21 Мај 2007
    1 person likes this.
  4. RagingDemon

    RagingDemon
    Unbeatable

    6,332
    5,247
    24 Март 2009
    Машко
    Јас прочитав нешто набрзинка но ме буни тоа транзитивната зависност.
    Кај производи нели модел-от зависи и од Тип-от освен од ПроизводИД?
     
  5. marv

    marv
    Practice makes perfect

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

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

    mrce
    Intern

    176
    26
    2 ноември 2009
    @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...
     
  7. RagingDemon

    RagingDemon
    Unbeatable

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

    mrce
    Intern

    176
    26
    2 ноември 2009
    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...
     
    1 person likes this.
  9. marv

    marv
    Practice makes perfect

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

    RagingDemon
    Unbeatable

    6,332
    5,247
    24 Март 2009
    Машко
    Значи како што разбрав треба да го направам следново (за секоја табела посебно):

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

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

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

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

    marv
    Practice makes perfect

    2,222
    1,509
    5 oктомври 2007
    Машко
    За 1. и 2. ДА така е .Си сватил :) Спојувањето се прави со Select..... JOIN ..... ON ... Значи седни прочитај малце за SQL да не ја разводнуеме сега работава овде.
     
  12. RagingDemon

    RagingDemon
    Unbeatable

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

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

    proizvodi:

    [​IMG]

    Proizvoditeli:

    [​IMG]

    и tipovi:

    [​IMG]

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

    PHP:
    mysql_query("SELECT * 
    FROM  `proizvodi` "
    );
    и овој код ми го врака следново:

    [​IMG]

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

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

    1 procesor AMD Phenom II X6 1075T 13000 6.
     
  13. Trooper

    Trooper
    Intern

    15
    5
    24 Февруари 2010
    Еве пример со 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
    
     
    1 person likes this.
  14. marv

    marv
    Practice makes perfect

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

    RagingDemon
    Unbeatable

    6,332
    5,247
    24 Март 2009
    Машко
    И јас би играл така, некако глупо ми звучи правење на табела само со име и презиме :)

    Е сега уште да прашам дали мора со 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
     
  16. marv

    marv
    Practice makes perfect

    2,222
    1,509
    5 oктомври 2007
    Машко
    Во твојов случај можеш како сакаш, бидејки и твојата команда со WHERE всушност е еден тип на JOIN т.е. INNER JOIN. Ама само во оној случај. Има ситуации каде неможеш се да завршиш со просто селектирање и потоа филтрирање со WHERE.
     
  17. RagingDemon

    RagingDemon
    Unbeatable

    6,332
    5,247
    24 Март 2009
    Машко
    Значи штом ми врши работа, добро е :)
    Фала на сите, посебно на марв, многу ми помогна. Ако ми излезе уште некој проблем ке пишам пак.
     
  18. RagingDemon

    RagingDemon
    Unbeatable

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

    username
    Gaining Experience

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

    Fiasco
    Gaining Experience

    3,036
    203
    2 Март 2008
    Tиe тиe сe foreign клучови во табeлата Производи, нeмаш потрeба од композитeн примарeн клуч.
     

Сподели

Вчитување...