Opzet meerdere talen uit database
Ik ben bezig een site te vernieuwen en ik wil er graag een cms achter hangen zodat de site door meerdere mensen onderhouden kan worden.
Alle tekst moet dus uit de database gehaald worden. Geen probleem. Alleen nu moet alle content in minimaal 2 talen gepubliceerd worden.
Nu heb ik zitten denken hoe ik de tabellen het beste kan indelen alleen ik ben er nog niet over uit. Qua overzicht is dit het makkelijkst:
id|nltitel|nlcontent|detitel|decontent|entitel|encontent
maar is het toch verstandig om te kiezen voor iets anders? en zoja, dat dan precies?
Ik ben benieuwd naar jullie suggesties
ik zou de talen als ik jou was in apparte tabbelen houden...
Dan ook nog een speciale tabel om de boel te linken? menu-item en bijbehorend taal id voor de betreffende content?
Stel je hebt een pagina nieuws.php, die uit de tabel nieuws wat op zou halen, de gebruiker heeft als taal Engels (en) ingesteld, de taalsessie variabele heb je opgeslagen in $taal. (bevat dus en)
Qua onderhoud is het gemakkelijker, je houd nog veel meer overzicht, omdat niet alle talen bij elkaar in die 1e tabel staan.
(wanneer je wilt gaan bewerken, kan je ook voor elke taal een tekstvak maken, als je de talen in een array hebt staan:
Code (php)
Snap je het?
Edit:
typo
Gewijzigd op 01/01/1970 01:00:00 door Robert Deiman
Quote:
(wanneer je wilt gaan bewerken, kan je ook voor elke taal een tekstvak maken, als je de talen in een array hebt staan:
Snap je het?
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$talen=array("nl","en","de");
$editpage='$_GET['edit'];//bevat de naam van de te bewerken tabel
foreach($talen as $tekstlang){
$createlang=$tekstlang.$editpage;
echo '<textarea name="'.$createlang.'"></textarea>';
}
?>
$talen=array("nl","en","de");
$editpage='$_GET['edit'];//bevat de naam van de te bewerken tabel
foreach($talen as $tekstlang){
$createlang=$tekstlang.$editpage;
echo '<textarea name="'.$createlang.'"></textarea>';
}
?>
Snap je het?
En: Ik moet er dan dus wel op een een of andere manier voor zorgen dat altijd de juiste tekst wordt opgehaald wanneer een menuitem gekozen wordt. Ik MOET er dus voor zorgen dat de id's van de content van elke taal hetzelfde is, of moet ik dit nog netjes aan elkaar koppelen met een aparte tabel?
Stel je hebt http://url.nl/?edit=nieuws
Dan maakt die voor elke taal een aparte textarea aan, waarin je dan nieuws kan toevoegen in een taal. ;)
(hoop dat dat wat duidelijker is)
VRAAG 2:
Neej, niks geen gekoppel, je tabelopzet is voor de talen overal hetzelfde (in nieuws verwacht ik bijv wel een datumveld)
Elke tabel, is dan hetzelfde als het origineel, alleen bevat het een andere taal..
Jouw voorbeeld er even bij pakkende:
id|nltitel|nlcontent|detitel|decontent|entitel|encontent
zou dan zo worden (caps -> tabeltitel):
NLTITEL
id|titel|content
ENTITEL
id|titel|content
DETITEL
id|titel|content
Dat heeft voordelen inderdaad. Wel is het dan noodzaak dat elke content hetzelfde id heeft maar dat tegen te gaan/op te lossen.
Bedankt Robert! Ik ga even wat opzetten!
en als je van taal wil switchen vervang je dan simpelweg de waarde in die session
Crispijn:
Hmmm, oke. Ik kan dan dus ook per taal een UPDATE query uitvoeren en kijken wie wanneer het laatst geupdate heeft.
Dat heeft voordelen inderdaad. Wel is het dan noodzaak dat elke content hetzelfde id heeft maar dat tegen te gaan/op te lossen.
Bedankt Robert! Ik ga even wat opzetten!
Dat heeft voordelen inderdaad. Wel is het dan noodzaak dat elke content hetzelfde id heeft maar dat tegen te gaan/op te lossen.
Bedankt Robert! Ik ga even wat opzetten!
Wat is dat toch met de ID? Als je ervoor zorgt dat je bij een aantal dingen een datum hebt staan.. en als je voor de links wil, zorg dan dat je overal een naam hebt voor die link (bijvoorbeeld home, of pics) die in elke tabel weer hetzelfde is, dat scheelt onderhoud.. VEEL onderhoud..
Als je na de 1e update dit doete
$id=last_insert_id();
(ik geloof dat het zo was)
dan kan je $id gebruiken om die andere tabellen te maken ;)
Robert:
Overigens:
Als je na de 1e update dit doete
$id=last_insert_id();
(ik geloof dat het zo was)
dan kan je $id gebruiken om die andere tabellen te maken ;)
Als je na de 1e update dit doete
$id=last_insert_id();
(ik geloof dat het zo was)
dan kan je $id gebruiken om die andere tabellen te maken ;)
Volgens mij heet het
Gewijzigd op 01/01/1970 01:00:00 door Klaasjan Boven
Dank klaasjan, dit was uit mijn hoofd, maar het is inderdaad mysql_insert_id();
Ik kan het al prima in één tabel prakken alleen nu wil ik het graag in twee tabellen tegelijk zetten. Ik heb het volgende gedaan alleen dan krijg ik een foutmelding:
databases:
content_nl
content_de
query:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
$sql_nc = "INSERT INTO content_nl AND content_de
(
id,
titel,
content,
last_date,
user
)
VALUES
(
'',
'$titel',
'$tekst',
NOW(),
'".$_SESSION['ID']."'
)
";
?>
$sql_nc = "INSERT INTO content_nl AND content_de
(
id,
titel,
content,
last_date,
user
)
VALUES
(
'',
'$titel',
'$tekst',
NOW(),
'".$_SESSION['ID']."'
)
";
?>
Op deze manier kan ik dus de id's overal het zelfde houden van de nederlandse, en duitse content.
Wie o wie?
edit: typo in query
Gewijzigd op 01/01/1970 01:00:00 door Crispijn -
id
iso_code
tekst
id
id_taal (foreignkey met tabel taal)
titel
tekst
etc
koppeltabel:
id_tekst_origineel(foreignkey met tabel tekst)
id_tekst_vertaling (foreignkey met tabel tekst)
UNIQUE (id_tekst_origineel, id_tekst_vertaling)
Met dit datamodel kun je het aantal talen onbeperkt uitbreiden zonder dat je ooit een wijziging in het datamodel hoeft te maken. Alle teksten (in de verschillende talen) staan in 1 tabel, die zijn gekoppeld aan de taal en via de koppeltabel aan elkaar zijn gekoppeld. Zo kun je zien dat record 1 (nl) bij record 23 (engels) en record 48 (russisch) hoort.
Wil je het goed doen, zorg dan ook voor een constraint die een verband legt tussen de taal, het origineel en de vertaling. Dan kun je nooit 1 origineel krijgen met 2 vertalingen in dezelfde taal.
Uiteraard gebruik je de innoDB-engine van MySQL of stap je over op PostgreSQL.
Ik ga je oplossing nog wel even doorspitten frank! Ziet er iig profi uit :D
Quote:
Zo profi is het niet, wanneer je gaat normaliseren kom je gewoon op dit model uit. Weinig keuze dus.Ik ga je oplossing nog wel even doorspitten frank! Ziet er iig profi uit :D
Het gegeven 'titel' sla je op in de kolom 'titel'. Dat de tekst in verschillende talen kan worden genoteerd, staat daar los van. Wanneer je 'titel' zou vervangen door 'voornaam', ga je toch ook niet voor iedere verschillende voornaam een andere tabel aanmaken?
En dat er dankzij de vertalingen een verband zit tussen de verschillende records, dat los je standaard op met een koppeltabel. Wanneer je 2 personen met elkaar zou willen verbinden, bv. spelers in een elftal, dan los je dat ook op met een koppeltabel.
Kortom, het zijn standaard oplosingen. Tevens heeft het tot voordeel dat de database sneller is te doorzoeken. Je gebruikt tenslotte minder kolommen met dezelfde soort gegevens waardoor de indexen efficienter worden gebruikt.
Klopt. Hier zat ik ook aan te denken. Vandaar ook mijn eerste posts. Toen werd 't me afgeraden het met koppeltabellen te doen...
Ik moet toegeven dat ik in eerste instantie dacht aan de oplossing voor elke taal een tabel maar toen kwam die tutorial over het normaliseren en begon ik te twijfelen. Ik zie dat ik me daar toch eens wat meer in moet verdiepen.
Maar zoals net gezegt werd Frank, dat je met een 1 taal 1 tabel oplossing minder onderhoud hebt t.o.v. jouw oplossing >>> Klopt dat dan ook?
De opzet die ik je heb gegeven, geeft je de mogelijkheid om een nieuw record toe te voegen aan de tabel 'taal' en klaar is kees. Daarmee krijg je direct de mogelijkheid om nieuwe vertalingen aan te maken en deze te koppelen aan de bestaande teksten. Tegen de tijd dat hij klaar is met zijn script, heb jij alle vertalingen al klaar...
Bedankt iig voor je uitleg. Het wonder 'normaliseren' begint me steeds duidelijker te worden!
Cris
Frank:
Ik zie niet in wat het probleem met onderhoud is, hooguit dat de opzet van Robert juist meer onderhoud vereist. In zijn opzet kun je onmogelijk een extra taal in de database wegschrijven en vervolgens de vertalingen gaan inkloppen. Hij zal eerst een nieuwe release van zijn script moeten gaan schrijven voordat een extra taal kan worden geintroduceerd. Dat lijkt mij niet de meest handige opzet.
De opzet die ik je heb gegeven, geeft je de mogelijkheid om een nieuw record toe te voegen aan de tabel 'taal' en klaar is kees. Daarmee krijg je direct de mogelijkheid om nieuwe vertalingen aan te maken en deze te koppelen aan de bestaande teksten. Tegen de tijd dat hij klaar is met zijn script, heb jij alle vertalingen al klaar...
De opzet die ik je heb gegeven, geeft je de mogelijkheid om een nieuw record toe te voegen aan de tabel 'taal' en klaar is kees. Daarmee krijg je direct de mogelijkheid om nieuwe vertalingen aan te maken en deze te koppelen aan de bestaande teksten. Tegen de tijd dat hij klaar is met zijn script, heb jij alle vertalingen al klaar...
Frank, ik heb het allemaal een beetje gevolgd, ik moet zeggen dat jouw oplossing inderdaad een hele goede is. (veel beter dan die van mij)
Het toevoegen van een nieuwe taal is helemaal niet zoveel werk als je voor doet komen, maar het is bij jouw opzet nog veel gemakkelijker.. AND THAT'S THE POINT!! :)
DAnkjewel Frank voor deze oplossing.