Diskuze: Návrh DB - Realitní kanceláře
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 14 zpráv z 14.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí SQL a databází, jsme si ověřili nabyté zkušenosti z kurzu.
Vztahy by měly být tak, jak jsem to neuměle nakreslil na obrázek (nemám tu design tool).
Ahoj,
připravil jsem si pro tebe krátkou anketu:
Narážím na to, že je obtížné vytvořit dobrý databázový model, pokud neznám případy užití...
Díky za návrhy a postřehy abych odpověděl Silvinois tak:
1)ano
2)ne
3)ano
4)ne
5)prodávající ma N nemovitostí a jedna nemovitost patří právě jednomu
prodávajícímu
6)ne nemůže
7)ne, jednu nemovitost může prodávat pouze jedna realitní kancelář
ano
9)pokud je záznam v tabulce Prodané tak nabídka je prodaná nebo také
id_prodane v tabulce Nabídka se nerovná NULL
10)Nevím co přesně myslíš, id nového vlastníka je uchován v položce
vlastník v tabulce Prodané a starý vlastník je v podstatě přístupný
přes id_nabidky v tabulce Prodané, jelikož nabídka se po prodeji z db
nemaže
Díky za odpověď, teď jsem se na to díval a dává to větší smysl než to moje. Jenom jsme úplně neporozuměl tomu bodu 7). Jak si to myslel s těmi prodanými?
Že máš tabulku pro poptáku a další pro nabídku => ty pak udělají třetí (vazební) kde bude ten prodej
Máš relace:
Když se uskuteční prodej, je to na základě nabídky a poptávky, takže prodej není o prodané nemovitosti, ale o uskutečnění vztahu nabídka/poptávka.
Tím pádem je korektní pouze relace:
Z nabídky se dostaneš na nemovitost, tím pádem víš, co bylo prodáno. Na druhou stranu prodaná nemovitost je taková, kde existuje nabídka odkazovaná prodejem.
Všechny prodané nemovitosti (T-SQL):
select *
from Nemovitost as nem inner join
Nabidka as nab on nem.id = nab.id_nemovitost inner join
Prodej as prd on nab.id = prd.id_nabidka
Všechny neprodané nemovitosti (T-SQL):
select *
from Nemovitost as nem inner join
Nabidka as nab on nem.id = nab.id_nemovitost left join
Prodej as prd on nab.id = prd.id_nabidka
where prd.id is null
Koukám, že jsem výše uvedl relaci MxN, ale je to vlastně nepovinný vztah 1x1.
Jinak před tvorbou ER modelu se vyplatí mít use-cases v aplikaci, bez nich se navrhuje databáze hodně těžko. Což je důvod, proč se Silvinios ptal na tolik otázek.
Já se na koukal jako na školní projekt a selským rozumem jsem udělal jednoduchý koncept. Reálná databáze by neměla 10 tabulek, ale tak 100. Tam už to bez UC nejde.
ERM pak musí reflektovat funkční vztahy bez přidaných závislostí. Pokud nemáš rozmyšlené use-cases, vždycky dostaneš model, který je redundantní z hlediska funkčních závislostí. Sice existuje proces dekompozice, kterým se to odstraňuje, ale to už je oprava chybného návrhu.
Super, díky moc za vysvětlení, právě ta relace MxN u prodeje mě zmátla
. Předělal jsem to podle
tvojich rad a teď to vypadá takhle.
Ještě můžeš zvážit, jestli u tabulek neudělat flag na aktuální platnost.
Obvykle se v databázi drží i kompletní historie všech událostí. Tzn. že pokud se např. prodejce rozhodne změnit nabídku, tak se stará označí jako neplatná (ale fyzicky se nemaže) a vytvoří se nová. Všechny dotazy do databáze pak musí zohledňovat aktuální platnost záznamu, což je pouze jedna podmínka navíc.
A koukám, že máš různě pojmenované primární klíče ve všech tabulkách. Primární klíč by vždy měl být "id" bez dalšího názvu.
Jsou dvě varianty názvu primárního klíče, každá z nich má své opodstatnění:
Ani jsem nevěděl, že NATURAL JOIN nebo USING existují. Pracuju s T-SQL a tam nic takového není. Také používám starší nástroje a frameworky, kde různé názvy PK způsobují komplikace.
Nicméně, díval jsem se na diskuze a obě konstrukce se odsuzují jako nepředvídatelné a nedoporučuje se použití, což celkem chápu. Také radši používám průnik funkcionality, aby mi dotazy běhaly na MS SQL Serveru i SQLite současně. Ovšem proti gustu žádný dišputát.
NATURAL JOIN beru s rezervou, ale USING někdy používám. Zejména pokud mě někdo nutí, abych používal stejné názvy pro PK a FK. Dlouhé názvy bez používání USING nemají valného významu.
Raději mám jako PK prosté "id" a jako FK "tabulka_id".
Zobrazeno 14 zpráv z 14.