sql >> Database >  >> RDS >> Database

Best practices voor het ontwerpen van meertalige databases

Om meertalige ondersteuning in uw datamodel te implementeren, hoeft u het wiel niet opnieuw uit te vinden. Dit artikel laat je de verschillende manieren zien om dit te doen en helpt je de manier te kiezen die het beste bij je past.

Het concept van lokalisatie is essentieel voor de ontwikkeling van een softwaretoepassing, vooral wanneer de reikwijdte van die toepassing wereldwijd is. Ondersteuning voor meerdere talen is het belangrijkste aspect om te overwegen; een databaseontwerp dat een meertalige toepassing ondersteunt, stelt u in staat uw doelmarkten te diversifiëren en zo veel meer klanten te bereiken. Bovendien kan zo'n databaseontwerp deel uitmaken van uw langetermijnstrategie voor het ontwerpen van systemen die klaar zijn voor lokalisatie.

De sleutel tot het opnemen van meertalige ondersteuning in uw toepassing is om dit op een manier te doen die de ontwikkeling- of onderhoudskosten niet drastisch verhoogt. Aangezien databasemodellering een onlosmakelijk onderdeel is van het softwareontwikkelingsproces, moet u nadenken over de beste ontwerpstrategie voor gegevensmodellen om uw toepassing meertalige ondersteuning te bieden.

Een goed datamodel zou u in staat moeten stellen om de applicatie aan te passen of nieuwe functionaliteit toe te voegen met behoud van meertalige ondersteuning - zonder extra inspanning of kosten. Het zou je ook in staat moeten stellen om nieuwe talen op te nemen zonder de applicatie aan te raken; u hoeft alleen de bijbehorende vertaalgegevens aan de database toe te voegen.

Eenvoudige implementatie versus flexibiliteit en functionaliteit

Er zijn verschillende benaderingen voor het maken van een databaseontwerp voor meertalige toepassingen. Elk heeft zijn voor- en nadelen. De eenvoudigere implementaties bieden minder flexibiliteit en minder functionaliteit; degenen die meer flexibiliteit en functionaliteit bieden, hebben complexere implementaties.

Mijn advies hier is om altijd te gaan voor degenen die meer functionaliteit en flexibiliteit bieden , zelfs als ze duurder zijn om te implementeren. Soms maken we de fout om te denken dat een applicatie te klein is, dat het niet de moeite waard is om complexe schema's te implementeren om zaken als meertalige ondersteuning op te lossen. Maar uiteindelijk zal die toepassing groeien en we zullen spijt hebben dat we hebben gekozen voor de "quick and dirty"-aanpak die eenvoudiger en goedkoper leek.

Het ideaal voor het implementeren van aanvullende functionaliteit in een toepassing - of het nu gaat om ondersteuning in meerdere talen, logboekregistratie van wijzigingen, gebruikersauthenticatie of iets anders - is dat die functionaliteit zijn eigen subschema heeft en zijn logica ingekapseld in herbruikbare componenten. Op deze manier kunnen zowel de accessoirefunctionaliteit als het bijbehorende subschema met minimale inspanning in elke nieuwe applicatie worden geïntegreerd.

Een intelligent databaseontwerp en datamodelleringstool zoals Vertabelo is een grote hulp voor het efficiënte beheer van uw schema's en subschema's. Bekijk ook deze tips voor een beter databaseontwerp en zorg ervoor dat u ze allemaal volgt. Voordat u begint met het tekenen van uw ER-diagram, raad ik u aan deze essentiële reeks tips voor databasemodellering te overwegen.

Enkele aantrekkelijke (maar niet aan te raden) meertalige database-ontwerpoplossingen

Makkelijkst – maar minst aanbevolen

Laten we beginnen met de minst aanbevolen maar gemakkelijkste manier om een ​​meertalige applicatiedatabase te implementeren. Het stelt u in staat om snel de noodzaak op te lossen om een ​​meertalige applicatie te ondersteunen, maar het zal u problemen opleveren wanneer de applicatie groeit in functionaliteit of in geografische dekking.

Deze eenvoudige strategie bestaat uit het toevoegen van een extra kolom voor elke tekstkolom die vertaald moet worden en voor elke taal waarin de teksten vertaald moeten worden.

Bijvoorbeeld in de Movies onderstaande tabel is er een OriginalTitle veld. Er wordt een extra titelkolom toegevoegd voor elke te vertalen taal:

MovieId Originele titel Title_sp Title_it Title_fr
1 Die Hard Duro de matar Trappola di cristallo Piege de cristal
2 Terug naar de toekomst Volver al futuro Ritorno al futuro Terug naar de toekomst
3 Jurassic Park Parque jurásico Giurassico-parco Parc jurassique

De toepassing moet de beschrijvingsgegevens verkrijgen uit de kolom die overeenkomt met de taal die door de gebruiker is geselecteerd. Wanneer u een nieuwe taal moet toevoegen, moet u een extra kolom aan de tabel toevoegen om de naar de nieuwe taal vertaalde teksten te bevatten. U moet de applicatie ook aanpassen om de toegevoegde taal en kolommen te erkennen.

Deze oplossing vereist geen ingewikkelde JOIN's om de vertaalde teksten te verkrijgen, en evenmin zijn dubbele records vereist - alleen de replicatie van kolommen met tekstinhoud. Maar de toepasbaarheid is beperkt tot situaties waarin slechts een paar tabellen vertaald hoeven te worden.

Stel dat u bijvoorbeeld een Products . heeft tabel en een Processes tafel. Elk van hen heeft een veld Beschrijving dat moet worden vertaald; lijkt gemakkelijk genoeg, toch? Maar als de hele applicatie (inclusief alle menu-opties, foutmeldingen, enz.) meertalig moet zijn, is deze oplossing niet van toepassing.

Veelzijdiger, maar ook niet aan te raden

Om door te gaan met het idee om vertalingen binnen dezelfde tabel te houden, is een alternatief voor de vorige optie om de tekstvelden te vergroten. Dit zou ons in staat stellen om alle vertalingen in hetzelfde veld op te slaan en ze te organiseren in een datastructuur (bijvoorbeeld een XML-document of een JSON-object). Hieronder hebben we een voorbeeld:

FilmID

Originele titel

Vertalingen

1

Die Hard

[

{"language":"sp", "title":"Duro de matar"},

{"language":"it", "title":"Trappola di cristallo"},

{"language":"fr", "title":"Piège de cristal"}

]

2

Terug naar de toekomst

[

{"language":"sp", "title":"Volver al futuro"},

{"language":"it", "title":"Ritorno al futuro"},

{"language":"fr", "title":"Terug naar de toekomst"}

]

3

Jurassic Park

[

{"language":"sp", "title":"Parque jurásico"},

{"language":"it", "title":"Giurassico parco"},

{"language":"fr", "title":"Parc jurassique"}

]

Deze optie vereist geen extra kolommen, maar voegt complexiteit toe. De gegevensquery's moeten nu in staat zijn om de gegevensstructuur die wordt gebruikt voor meertalige ondersteuning correct te verwerken en te interpreteren. Als bijvoorbeeld JSON of XML wordt gebruikt om vertalingen op te slaan, moeten SQL-query's een SQL-versie gebruiken die het gekozen gegevenstype ondersteunt.

De volgende SQL-opdracht gebruikt de MS SQL Server OPENJSON() functie om de inhoud van de Translations . te gebruiken veld als een ondergeschikte tabel:

SELECT
	m.MovieId,
	m.OriginalTitle,
	t.TranslatedTitle
FROM
	Movies AS m
	CROSS APPLY OPENJSON(m.Translations)
		WITH (
			language char(2) '$.language',
		TranslatedTitle varchar(100) '$.title’
		) AS t
WHERE t.language = 'fr';

Aangezien er geen functies of operators zijn om JSON- of XML-geformatteerde gegevens in standaard SQL te manipuleren, bent u genoodzaakt om uw query's voor een bepaald RDBMS te schrijven als u deze techniek wilt gebruiken om vertaalde teksten op te slaan. De vorige query wordt bijvoorbeeld niet ondersteund door MySQL. Als u de JSON-gegevens in de Movies tabel met MySQL, zou u deze vraag schrijven:

SELECT
	m.MovieId,
	m.OriginalTitle,
	JSON_EXTRACT(m.Translations, '$.title') AS TranslatedTitle
FROM Movies AS m
WHERE JSON_EXTRACT(m.Translations. '$.language') = 'fr';

Vertaalde tekst opslaan in verschillende records

U kunt er ook voor kiezen om voor elke taal verschillende records te gebruiken. U moet zich echter neerleggen bij het verliezen van normalisatie:dezelfde gegevens worden herhaald in verschillende records, waarbij alleen de vertaling varieert.

MovieId LanguageId Titel
1 nl Die Hard
1 sp Duro de matar
1 het Trappola di cristallo
1 fr Piege de cristal
2 nl Terug naar de toekomst
2 sp Volver al futuro
2 het Ritorno al futuro

Met deze optie kunt u weergaven van elke tabel maken die alleen de rijen in een bepaalde taal retourneren:

CREATE VIEW Movies_en AS
SELECT MovieId, Title
FROM Movies
WHERE LanguageId = 'en';

CREATE VIEW Movies_sp as
SELECT MovieId, Title
FROM Movies
WHERE LanguageId = 'sp';

Om vervolgens de tabel te doorzoeken, kunt u een andere weergave gebruiken, afhankelijk van de doeltaal van de vertaling. Maar de normalisatie van het model gaat verloren en het tafelonderhoud is onnodig complex.

Vertaalde tekst in aparte tabellen opslaan

Een manier om de vertaalde teksten op te slaan zonder het relationele model te verbreken, is door een detailtabel te hebben voor elke tabel met teksten die vertaald moeten worden. De ondergeschikte tabel met de vertalingen moet dezelfde sleutelvelden hebben als de moedertabel, plus een veld dat de vertaaltaal aangeeft.

Een ondergeschikte tabel met vertalingen moet dezelfde sleutelvelden hebben als de moedertabel, plus een veld dat de vertaaltaal aangeeft.

Met deze optie kunt u nieuwe talen opnemen zonder de tabelstructuur te wijzigen. Het vereist geen overbodige informatie genereren of de modelnormalisatie doorbreken.

Het nadeel van deze optie is dat er voor elke tabel een ondergeschikte tabel moet worden gemaakt waarin tekstuele gegevens worden opgeslagen die moeten worden vertaald. Het idee om vertalingen op te slaan in gerelateerde tabellen brengt ons echter dichter bij de meest aanbevolen manier om een ​​meertalige database te ontwerpen.

De universele oplossing:een subschema voor vertaling

Om een ​​applicatie en zijn database echt meertalig te laten zijn, moeten alle teksten een vertaling hebben in elke ondersteunde taal - niet alleen de tekstgegevens in een bepaalde tabel. Dit wordt bereikt met een vertaalsubschema waarin alle gegevens met tekstuele inhoud die de ogen van de gebruiker kunnen bereiken, worden opgeslagen.

In webapplicaties die bedoeld zijn voor gebruik in verschillende talen, is een vertaalsubschema een noodzaak, geen optie. Al het andere zal leiden tot complexiteiten die goed onderhoud van de applicatie onmogelijk maken.

De sleutel tot het bewaren van vertalingen in een apart schema is om een ​​geïndexeerde catalogus bij te houden met alle teksten die vertaald moeten worden, of het nu entiteitsbeschrijvingen, foutmeldingen of menu-opties zijn. Het idee is dat er geen tekst wordt opgeslagen die de ogen van de gebruiker kan bereiken in een tabel buiten dit subschema.

Een manier om de vertaalcatalogus te ordenen is door drie tabellen te gebruiken:

  • Een hoofdtabel met talen.
  • Een tabel met teksten in de originele taal.
  • Een tabel met vertaalde teksten.

Schema voor een universele vertaalcatalogus.

In de hoofdtabel met talen voegen we eenvoudig een record in voor elke taal die door het gegevensmodel wordt ondersteund. Elk heeft een ID-code en een naam:

LanguageId TaalNaam
nl Engels
sp Spaans
het Italiaans
fr Frans

De teksttabel registreert alle teksten die vertaald moeten worden. Elk record heeft een willekeurige ID, de originele tekst en de ID van de originele taal.

In de TextContent tabel, de originele tekst en de ID van de originele taal zijn niet strikt noodzakelijk. Maar ze vereenvoudigen wel zoekopdrachten waarvoor geen vertaling nodig is. Als u bijvoorbeeld statistische analyses of beheercontroles uitvoert (die meestal alleen beschikbaar zijn voor gebruikers die de oorspronkelijke taal begrijpen), kunnen de zoekopdrachten worden vereenvoudigd door gebruik te maken van de standaard (niet-vertaalde) teksten.

De originele teksten zijn ook handig voor wie de tabel met vertaalde teksten moet vullen. Het invoeren van vertaalgegevens kan door middel van een mini-applicatie die de originele tekst en vertalingen in alle beschikbare talen toont. Het is ook mogelijk om informatie voor het vertaalsubschema te genereren via een automatisch proces met behulp van een vertaal-API.

Koppelen met het hoofdschema

In het hoofdschema van de applicatie worden kolommen met tekstwaarden die vertaald moeten worden vervangen door ID's die verwijzen naar de tabel met vertaalde teksten:

Het hoofdschema is gekoppeld aan het vertaalschema via tabellen met teksten die vertaald moeten worden.

U kunt het originele tekstveld in sommige van de hoofdschematabellen laten staan ​​om zoekopdrachten te vergemakkelijken waarbij vertaling niet vereist is, ook al genereert dit overbodige informatie. We kunnen bijvoorbeeld de ProductDescription . behouden veld in het Products tabel om statistische zoekopdrachten te vergemakkelijken of om de afmetingen van een datawarehouse te vullen, waarbij het vertaalsubschema buiten beschouwing wordt gelaten wanneer dit niet nodig is.

  • Meertalige database-ontwerp:doe het één keer en doe het goed

We hebben verschillende alternatieven gezien voor het maken van een meertalig databaseontwerp. Sommige zijn eenvoudiger en sneller te implementeren. De laatste oplossing is wat complexer, maar geeft je veel meer flexibiliteit. Het bespaart u ook problemen als het tijd is om de applicatie en de database te onderhouden. Dus op de lange termijn zal het veel goedkoper zijn.

Soms verleidt de kortste weg bij het ontwerpen van databases u tot de overtuiging dat u tijd en moeite bespaart. Maar als je ervoor kiest, zie je over het hoofd dat je waarschijnlijk meerdere keren naar beneden moet. Als u de best practices voor het ontwerpen van meertalige databases negeert, zult u waarschijnlijk steeds weer hetzelfde werk doen.


  1. Hoe u consequent een Microsoft Access MVP Award kunt verdienen

  2. Tabel maken met behulp van GUI in SQL Server - SQL Server / T-SQL-zelfstudie, deel 37

  3. 3 manieren om rijen met kleine letters te vinden in SQLite

  4. De beste manier om dubbele invoer in de mysql-database te voorkomen