Relationsdatabaser - praktiska exempel i Drupal?

We encourage users to post events happening in the community to the community events group on https://www.drupal.org.
Spindler_'s picture

Hej!
Jag har lite funderingar kring databaser, kopplingar mellan tabeller etc.
Har letat efter guider eller manualer som tar upp mitt ärende, men inte hittat något som klargör sakerna tillräckligt bra. Johan Falks utmärkta lilla bok ”Börja med Drupal” gav mig en del på vägen men inte hela lösningen till hur allt hänger ihop.

Jag är van vid att skapa databastabeller och deras relationer på traditionellt vis, och misstänker att tankesättet skiljer sig en aning när man arbetar med Drupal.

Så här skulle jag löst fallet med vanligt databas-tänk ...

Exempel: En hemsida med en massa olika matvaror som kan ingå i flera olika recept. Dessa recept kan höra till ETT visst kök, exempelvis det asiatiska, italienska etc.

Här tänker jag enligt följande:
FLERA olika matvaror (ost, salt) kan ingå i FLERA olika recept (pizza, potatisgratäng)
(Förhållande N-N)

FLERA recept (t ex pizza) kan var och ett bara höra till ETT enda kök (italienskt).
(Förhållande N-1)

Mina databastabeller skulle lite förenklat innehålla dessa fält:

Tabell MATVARA (matvarans namn)
Matvara_id
Namn

Tabell RECEPT (receptets namn samt en koppling till aktuellt kök)
Recept_id
Namn
Kök_id

Tabell KÖK (kökets namn)
Kök_id
Namn

Tabell KOPPLING_MATVARA_RECEPT (Kopplingstabellen mellan tabellerna Matvara och Recept)
Matvara_id
Recept_id

Det jag nu undrar är om någon vill ta sig tid att redogöra för (eller posta en länk om mina frågor redan ställts) hur ovanstående ”relationships” bäst skulle skapas med hjälp av CCK och Views?
Förutom kopplingstabellen här ovan så skulle väl tabellerna bli tre olika ”content types”.
Att ”node reference” är nyckeln här är givet, men jag är inte säker på i vilket ”content type” respektive ”node reference” skulle hamna och hur det smartast tas fram med Views? En viktig feature vore ju också att enkelt kunna byta koppling mellan recept och matvara (om man t ex felaktigt råkat lägga matvaran Apelsin i receptet Pizza), något som jag inte lyckats åstadkomma på ett bra sätt i mina experiment.

Ursäkta den långa utläggningen och tack på förhand!

Comments

Det stämmer att Drupal inte

solipsist's picture

Det stämmer att Drupal inte fungerar som en relationsdatabas. Även om Drupal normalt använder en RDB för datahantering körs Drupal ovanpå den. Du får alltså ett abstraktionslager att arbeta med vilket har både för- och nackdelar. Med Django skulle man t ex använda dess ORM för att uttrycka de relationer du beskriver ovan, det är mer flexibelt men kräver betydligt mer programmering än Drupal.

I Drupal har vi som du beskrev CCK och Views bland andra moduler. I CCK ingår en modul som heter Node Reference. Med denna kan du skapa relationer mellan noder i Drupal. Genom att skapa tre content types (eller nodtyper): matvara, kök och recept kan du sedan lägga till ett relationsfält till vardera. Du kan göra så att ett sådant fält bara tillåter relationer till en nod av en viss typ. Du kan också ställa in fältet att tillåta flera relationer (multiple). Views kan använda sig av dessa relationer när du hämtar och visar noder. Ska man tala teknik så handlar det om att Views kan göra JOIN åt dig genom att du gör Views medvetet om vilka entiteter (noder, användare, et c) du vill arbeta med och hur de relaterar till varandra.

Med andra ord kan du fortfarande tänka relationer men du slipper skriva dina egna SQL-frågor utan kan använda dig av Drupals användargränssnitt för att åstadkomma samma sak.