Vinnaren i pepparkakshustävlingen!
2011-03-24, 18:06
  #1
Medlem
Funcadelics avatar
Sitter och försöker bygga ihop en mässa där det, kortfattat, finns två typers besökare och aktiviteter respektive. I mässan ingår en del aktiviteter och vissa av dem har ett max antal besökare. För att kunna lista/spara besökarna på varje aktivitet har jag gjort en tabell som innehåller attributen "aktivitet" och "person" (båda två har unika ID). Naturligtvis(?) har jag även en tabell för besökare och en för aktiviteterna. I tabellen med aktiviteterna finns attributet "max antal besökare".

Hur skapar jag begränsningen att det max får skrivas in X antal personer på aktivitet Y?

Jag har kortat ner problembeskrivningen ganska ordentligt men jag tror det räcker för min frågeställning. Skulle någon mer information behövas är det bara att säga till.

Klistrar in all min kod, observera att det finns tabeller som jag inte beskrivit eftersom de egentligen inte har med frågeställningen att göra men som jag lämnar för översiktens skull.


Tack på förhand.
Citera
2011-03-24, 18:38
  #2
Medlem
valter-eggons avatar
Spontant känns det som att sådan typ av affärslogik borde ligga i applikationslagret eller möjligen i en insert trigger som kollar om värdet får läggas in.

Att lägga det i själva constrainten är inte något som i alla fall jag sett tidigare.

Så nej, jag kan inte svara på din fråga hur man gör det i constraints men däremot hur jag skulle ha löst det. Rent förvaltningsmässigt så känns det inte riktigt bra det där.
Citera
2011-03-24, 19:06
  #3
Medlem
Funcadelics avatar
Citat:
Ursprungligen postat av valter-eggon
Spontant känns det som att sådan typ av affärslogik borde ligga i applikationslagret eller möjligen i en insert trigger som kollar om värdet får läggas in.

Att lägga det i själva constrainten är inte något som i alla fall jag sett tidigare.

Så nej, jag kan inte svara på din fråga hur man gör det i constraints men däremot hur jag skulle ha löst det. Rent förvaltningsmässigt så känns det inte riktigt bra det där.

Jag är, som kanske märkts, nybörjare på det här. Kom gärna med tips hur man ska göra!
Citera
2011-03-24, 22:34
  #4
Medlem
valter-eggons avatar
Citat:
Ursprungligen postat av Funcadelic
Jag är, som kanske märkts, nybörjare på det här. Kom gärna med tips hur man ska göra!
Sätt upp relationerna med "vanliga" constraints för främmande nycklar, d.v.s. parent key får inte vara null, sen är det i din webbapplikation som du gör kontrollen hur många användare som är anmälda till en aktivitet. Baserat på hur många det är så väljer du om du vill aktivera Anmäl-knappen eller hur du nu kommer att bygga upp det.

Sen behöver du inte ha en tabell per aktivitet för att hantera anmälningarna det räcker med en participants tabell där du har aktivitets_id och person_id.

Du behöver inte heller ha flera tabeller för aktiviteterna. Du har ju redan en tabell activities där du kan sätta vilken typ av aktivitet det är och vad den heter.

Vill du plocka ut alla vetenskapliga aktiviteter så går du en select på activities där activityTypeId=din kategori. Sen kan du gå vidare och välja en viss aktivitet inom den kategorin och då använder du det aktivitets_id:t när du selectar från participants för att få ut vilka persons som kommer deltaga.

Glasklart!?
__________________
Senast redigerad av valter-eggon 2011-03-24 kl. 22:54.
Citera
2011-03-28, 11:35
  #5
Medlem
Funcadelics avatar
Tack för dina tips, är med mer i matchen nu. Jag har dock fortfarande ett problem med databasen.

Jag har som bekant två sorters personer, participants och companions. Dessa är betecknade med p respektive c. Jag vill begränsa möjligheten att lägga till en participant i listan över companions.

MySQL säger inte ifrån men verkar ignorera min check. Efter att ha tittat runt lite på Internet har jag listat ut att MySQL inte stödjer check utan att denna rad helt enkelt ignoreras. Jag kan alltså lägga till folk med personTypeID = C i participants. Förstår inte riktigt hur jag ska gå runt detta. Visserligen skulle jag kunna kontrollera detta i mitt externa javaprogram men jag gillar inte att ha ofullständiga databaser som man kan programmera in fel i om man vill. Finns det något bra sätt att kontrollera detta? Har kopierat in relevant kod men det är alltså sista raden jag undrar över.

Citera
2011-03-28, 12:12
  #6
Medlem
valter-eggons avatar
Citat:
Ursprungligen postat av Funcadelic
Tack för dina tips, är med mer i matchen nu. Jag har dock fortfarande ett problem med databasen.

Jag har som bekant två sorters personer, participants och companions. Dessa är betecknade med p respektive c. Jag vill begränsa möjligheten att lägga till en participant i listan över companions.

MySQL säger inte ifrån men verkar ignorera min check. Efter att ha tittat runt lite på Internet har jag listat ut att MySQL inte stödjer check utan att denna rad helt enkelt ignoreras. Jag kan alltså lägga till folk med personTypeID = C i participants. Förstår inte riktigt hur jag ska gå runt detta. Visserligen skulle jag kunna kontrollera detta i mitt externa javaprogram men jag gillar inte att ha ofullständiga databaser som man kan programmera in fel i om man vill. Finns det något bra sätt att kontrollera detta? Har kopierat in relevant kod men det är alltså sista raden jag undrar över.

Det blir ju lite klurigare det.

En lösning är ju då att återgå till olika tabeller för participants och companions. Det ska ju mycket till om man lägger in ett companion_id som främmande nyckel istället för person_id. Det är ju inte säkert att man får att överordnad nyckel saknas om man lägger in ett companion_id istället för person_id om det finns ett person_id med samma id som companion_id men risken borde vara ganska liten att man försöker sig på detta.
Citera
2011-03-28, 12:19
  #7
Medlem
Funcadelics avatar
Citat:
Ursprungligen postat av valter-eggon
Det blir ju lite klurigare det.

En lösning är ju då att återgå till olika tabeller för participants och companions. Det ska ju mycket till om man lägger in ett companion_id som främmande nyckel istället för person_id. Det är ju inte säkert att man får att överordnad nyckel saknas om man lägger in ett companion_id istället för person_id om det finns ett person_id med samma id som companion_id men risken borde vara ganska liten att man försöker sig på detta.

Participant kommer att ha ett unikt id (genererat i javakoden) men companion har inget companion_id utan har endast person_id. Själva vitsen med uppgiften är att companion endast ska hittas genom participant. Ganska dumt ja, men som läraren sade: "Ibland får ni definitioner av kund ni inte håller med om. Ni bör dock följa deras specifikationer. Därför bör ni följa vår beskrivning och inte lägga till extrainformation, även om det känns ologiskt.".

Jag har hittat information om triggers men lyckas inte klura ut hur jag ska få till if-satsen.

Kod:
delimiter //
create trigger typeCheck before insert on participants
for each row
begin
if personTypeID not like 'P' then
skriv ej in personen;
end if;
end//;

alternativt

Kod:
delimiter //
create trigger typeCheck before insert on participants
for each row
begin
if personTypeID like 'P' then
Skriv in personen;
end if;
end//;

Hur kan jag (inte) skriva in personen?
Citera
2011-03-28, 12:47
  #8
Medlem
valter-eggons avatar
Citat:
Ursprungligen postat av Funcadelic
Hur kan jag (inte) skriva in personen?
Kolla denna länk:
http://blogs.sun.com/svetasmirnova/e...raise_error_in

Det verkar som att enda sättet är att få din trigger att generera ett fel.

Det ska tydligen finns något som heter SIGNAL i version 6 så beroende på vilken version du kör kan du ju kolla upp hur SIGNAL används.

Innehållet i det jag länkade till är för version 5 och tidigare.
Citera
2011-03-28, 23:28
  #9
Medlem
Funcadelics avatar
Citat:
Ursprungligen postat av valter-eggon
Kolla denna länk:
http://blogs.sun.com/svetasmirnova/e...raise_error_in

Det verkar som att enda sättet är att få din trigger att generera ett fel.

Det ska tydligen finns något som heter SIGNAL i version 6 så beroende på vilken version du kör kan du ju kolla upp hur SIGNAL används.

Innehållet i det jag länkade till är för version 5 och tidigare.

Tack för den länken, hade hittat något liknande tidigare. Jobbigt att man ska behöva gå sådana omvägar. Läraren kommer att tappa hatten, tror inte han var beredd på detta när han gav oss uppgiften.
Citera
2011-03-29, 00:00
  #10
Medlem
valter-eggons avatar
Citat:
Ursprungligen postat av Funcadelic
Tack för den länken, hade hittat något liknande tidigare. Jobbigt att man ska behöva gå sådana omvägar. Läraren kommer att tappa hatten, tror inte han var beredd på detta när han gav oss uppgiften.
Min tanke hur du ska använda triggern är att skapa ett fel om man försöker lägga in en ogiltig person. Det förstod du ju men jag ville bara vara tydlig!

Sen kan jag tycka att din lärare är lite ute och cyklar i sitt resonemang. Jag har hittills aldrig blivit "tvingad" att skriva ett program på ett visst sätt av en kund. Om kundens tanke om hur det ska göras är väldigt ovanligt, onödigt och komplicerat så brukar kunden lyssna när man säger att det finns andra lösningar som är enklare eller lättare att förvalta och som de sparar tid på. Snabbare är billigare och då får man göra enligt eget förslag. Snabbare behöver inte alltid vara billigare i längden om man bara slänger ihop något utan att analysera konsekvenserna men det är inte det jag menar i detta fall.

Det är ju bara att kolla på den tid vi lagt på att lösa ett problem som i 99 fall av 100 löses i applikationslagret.
Citera
2011-03-29, 00:05
  #11
Medlem
Funcadelics avatar
Citat:
Ursprungligen postat av valter-eggon
Min tanke hur du ska använda triggern är att skapa ett fel om man försöker lägga in en ogiltig person. Det förstod du ju men jag ville bara vara tydlig!

Sen kan jag tycka att din lärare är lite ute och cyklar i sitt resonemang. Jag har hittills aldrig blivit "tvingad" att skriva ett program på ett visst sätt av en kund. Om kundens tanke om hur det ska göras är väldigt ovanligt, onödigt och komplicerat så brukar kunden lyssna när man säger att det finns andra lösningar som är enklare eller lättare att förvalta och som de sparar tid på. Snabbare är billigare och då får man göra enligt eget förslag. Snabbare behöver inte alltid vara billigare i längden om man bara slänger ihop något utan att analysera konsekvenserna men det är inte det jag menar i detta fall.

Det är ju bara att kolla på den tid vi lagt på att lösa ett problem som i 99 fall av 100 löses i applikationslagret.

Läraren gav mig och en labpartner en svårare uppgift än vad som egentligen var tänkt eftersom vi var mycket bättre än de andra på att programmera. Var väl inte direkt det jag trodde när jag skulle åka på ett erasmus-år, tanken är att man ska ha det lättare.. Det är egentligen en javakurs men läraren ville att vi skulle koppla det till SQL och skolan har endast MySQL. Vi skulle ha kunnat köra kollen i java men det var mest mitt ego som satte stopp för det. Tack för all din hjälp, återkommer i denna tråd om det skulle vara något annat som är oklart.
Citera
2011-03-29, 00:21
  #12
Medlem
valter-eggons avatar
Citat:
Ursprungligen postat av Funcadelic
Läraren gav mig och en labpartner en svårare uppgift än vad som egentligen var tänkt eftersom vi var mycket bättre än de andra på att programmera. Var väl inte direkt det jag trodde när jag skulle åka på ett erasmus-år, tanken är att man ska ha det lättare.. Det är egentligen en javakurs men läraren ville att vi skulle koppla det till SQL och skolan har endast MySQL. Vi skulle ha kunnat köra kollen i java men det var mest mitt ego som satte stopp för det. Tack för all din hjälp, återkommer i denna tråd om det skulle vara något annat som är oklart.
Varsågod! Jag lärde mig en del jag med!
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback