Databaseontwerp MySQL voor 2 families

Status
Niet open voor verdere reacties.

MajorGlory

Gebruiker
Lid geworden
5 sep 2008
Berichten
8
Hoi,

Ik ben bezig met het maken van een website voor onze familie (vaders kant en moeders kant) met daarop onder andere een adresboek met alle familieleden. Alle leden van de familie krijgen een inlogcode en wachtwoord. Daarvoor heb ik een tabel users aangemaakt.

Nu wil ik het volgende:

- Als mijn vader, moeder, zus, broer of ik inlog moeten ze alle familieleden kunnen zien.

- Als iemand uit de familie van mijn moeders kant inlogt, mag diegene niet de familieleden van mijn vaders kant zien en vice versa.

- Mijn vader, moeder, zus, broer en ik moeten voor beide families zichtbaar zijn.

- Met het oog op de toekomst moet het niet moeilijk te zijn om een familie toe te voegen.

Ik had gedacht iedereen van mijn vaders kant lid te maken van familie A en mijn moeders kant familie B, maar dan loop ik tegen punt drie aan. Want het gezin waar ik inzit moet zowel lid zijn van fam. A als fam. B.

Hoe los ik dit het beste op?

Alvast dank.
 
Maak van je eigen gezin (dus jou vader, moeder, broer en zus) fam. C.
Bij het schrijven van je programma moet je dan rekening houden met volgende "rechten"
- fam. A mag fam. A en fam. C zien
- fam. B mag fam. B en fam. C zien
- fam. C mag fam. A, fam. B en fam. C zien.

Als iemand inlogt van fam. A, dan geef je een overzicht met
SELECT * FROM tblFamilie WHERE fam='A' OR fam='C';

Als iemand inlogt van fam. B, dan geef je een overzicht met
SELECT * FROM tblFamilie WHERE fam='B' OR fam='C';

Als iemand inlogt van fam. C, dan geef je een overzicht met
SELECT * FROM tblFamilie;
 
Laatst bewerkt:
Ok, bedankt. Dat moet hem zijn inderdaad. :thumb:

En om dan op puntje vier terug te komen, Ik zou om de rechten makkelijk aan te passen, mocht er een familie bij komen, een tabelletje aan kunnen maken met welke families er geselecteerd mogen worden.

Eigenlijk vrij simpel, maar kon er zelf ff geen oplossing voor verzinnen. :)

Ik laat morgen nog wel even weten of het gelukt is.
 
Als iemand inlogt van fam. A, dan geef je een overzicht met
SELECT * FROM tblFamilie WHERE fam='A' OR fam='C';

Als iemand inlogt van fam. B, dan geef je een overzicht met
SELECT * FROM tblFamilie WHERE fam='B' OR fam='C';

Als iemand inlogt van fam. C, dan geef je een overzicht met
SELECT * FROM tblFamilie;

Dit is niet netjes je moet altijd proberen data en implementatie toe scheiden. Want wat ga je doen als er familie D bij komt.? Dan moet je de code aanpassen !. Beter is om deze logica in een tabel te stoppen. Een erg simpele oplossing om een tblRechten aan te maken.. Met 2 kolomen, familie naam en welke familie deze mag zien.

tblRechten:
naam zichtbaar
A A
A C
B B
B C
C C

Je query wordt dan:
SELECT * FROM tblFamilie f , tblRechten r where f.fam = r.zichtbaar and r.fam = 'A'

Als er nu een nieuwe familie komt hoef je alleen maar een extra rijen in de tblRechten toe te voegen,:)
 
tblRechten:
naam zichtbaar
A A
A C
B B
B C
C C

Je query wordt dan:
SELECT * FROM tblFamilie f , tblRechten r where f.fam = r.zichtbaar and r.fam = 'A'
Ja, precies. Zo had ik het ook in gedachten. Kun je me wat uitleg geven over de query die je gebruikt? Die is mij niet helemaal duidelijk. Moet " r.fam = 'A' " niet " r.naam = 'A' " zijn?
 
Ja, precies. Zo had ik het ook in gedachten. Kun je me wat uitleg geven over de query die je gebruikt? Die is mij niet helemaal duidelijk. Moet " r.fam = 'A' " niet " r.naam = 'A' " zijn?

Klopt.. even niet goed opgelet tijden het typen..
 
Ah, ok.

Het werkt inmiddels helemaal. Ik heb nu een tabel met users, een tabel met families en een tabel met rechten voor families met daarin de Id's van de families. :)

Hartelijk dank voor de hulp!
 
Prima!!!

Toch nog even een vraagje...
Waarom een tabel users én een tabel families? Aan de hand van je uitleg lijkt het mij dat er voor elke record in users juist 1 overeenkomende record in families is, of tenminste, dat enkel die personen in families ook user kunnen zijn. Je zou die dan gewoon kunnen samenvoegen, niet?

('t is misschien muggenzifterij, maar toch... ;))
 
Laatst bewerkt:
Ik snap dat A, B en C niet helemaal, dat slaat ook eigenlijk nergens op.


users
pk_user
voornaam
achternaam
fk_familie -> [pk_familie]

familie
pk_familie
familienaam


Dan ben je klaar, je moet niet gaan *****n met letters, daar heb je niets aan. Gewoon een relatie leggen tussen fk_familie en pk_familie, dat kan makkelijk met InnoDB (dat is een van de MySQL-engines).
 
En omdat jij het niet snapt, slaat het ook nergens op???:shocked:
Het werktnogtans perfect hoor!

Jou fk_familie en pk_familie komen overeen met tblFamilie.fam en tblRechten.zichtbaar
De relatie die jij legt komt overeen met: WHERE f.fam = r.zichtbaar

Trouwens, welke waarden wil jij dan opslaan in fk_familie en pk_familie?
 
Eh, pk is auto_increment en fk is gewoon de 'fk'? Zoals dat altijd gaat bij relaties?
 
Misschien ligt het aan mij hoor, maar hoe beperk je daarmee dan de "zichtbaarheid" van bepaalde familieleden voor de anderen?
 
Waarom een tabel users én een tabel families? Aan de hand van je uitleg lijkt het mij dat er voor elke record in users juist 1 overeenkomende record in families is, of tenminste, dat enkel die personen in families ook user kunnen zijn. Je zou die dan gewoon kunnen samenvoegen, niet?

('t is misschien muggenzifterij, maar toch... ;))
In de users tabel staat 1 kolom genaamd familie. Daar vul ik de ID van de familie in die ik uit de familie tabel laat halen. Dus formuliertje met select vakje. Dan hoef ik niet bij het aanmaken van elke user de ID of de familienaam in te typen.

Het hele A, B en C verhaal was puur als voorbeeld. Ik had ook 1, 2 en 3 kunnen nemen of De Vries, De Jong en mijn_gezin. :p

Dan de tabel met rechten. Die ziet er nu zo uit:

Code:
id    fam_id    id_zichtbaar  
1     1           1 
2     1           2 
3     1           3 
4     2           2 
5     2           1 
6     3           1 
7     3           3
Dus familie 1 mag fam. 1, 2 en 3 zien, fam. 2 mag 2 en 1 zien en fam. 3 mag 1 en 3 zien.

Voor het aanpassen van deze tabel ga ik ook een formulier bouwen met daarin selectievakjes die familienamen en ID's uit de familie tabel halen.

Zo heb ik het nu gedaan, het werkt perfect, ik kan families wegfilteren voor andere families, het is uitbreidbaar met meerdere families en ik snap hoe het werkt dus wat wil ik nog meer? :cool:
 
De id in de tabel is niet echt nodig... De fam_id en id_zichtbaar zijn samen uniek. ;) .
Als je deze als samengestelde pk gebruikt hoef je ook geen constrain te zetten op fam_id en id_zichtbaar.:)
 
Status update :)

Ok, ben ik weer. Het idee zoals hierboven beschreven ging toch niet helemaal optimaal. Ik heb voor elk gezin aan beide kanten van de families een aparte familie aangemaakt. Elke familie kan ik weer lidmaken van een bovenliggende famile.

Nu kan ik dus, als iemand uit huis gaat wonen een nieuwe familie aanmaken met daarin zijn/haar Id en dat van zijn/haar vrouw/man. Eventuele kinderen koppel ik ook aan deze familie en op het moment dat die het huis uitgaan, etc, etc, etc.

De tabel met rechten per familie is nu dus erg lang geworden, maar dit is de meest flexibele manier. Mede omdat ik een handig formulier heb gebouwd waardoor je snel en makkelijk rechten toe kunt wijzen. :)

De tabel families bevat nu ook adresinformatie zodat alle leden van 1 gezin altijd hetzelfde adres hebben.

@Skinflowers: Kwestie van gewoonte denk ik. ;) En het lijkt me makkelijker om ze te verwijderen uit je database door met slechts 1 unieke variabele te werken.

Wat bedoel je met constrain? (Sorry, ben nogal een noob in SQL :o)
 
Laatst bewerkt:
Je moet er voor zorgen dat in je table rechten nooit 2x dezelfde records voorkomen. Omdat je een ID gebruikt kan je het volgende krijgen.

ID fam zichtbaar
1 A B
2 A B

Als je nu een query gaat runnen die deze records gebruikt zal je familie B 2x gaan zien. Je kan voor zo'n tabel dus een "constraint" aanmaken die dit verbiedt

create table rechten
fam number,
zichtbaar number
unique(fam,zichtbaar)


Nu kan je nooit meer dubbele records in de database krijgen :).
 
Heb ik aan gedacht. Ik heb het formulier zo geprogrammeerd dat er gecontroleerd wordt of het recht al bestaat. :thumb:
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan