sql >> Database >  >> RDS >> PostgreSQL

Beste werkwijze voor het opslaan van meertalige tekenreeksen

Zorg er eerst voor dat de database locale kan omgaan met verschillende talen. Gebruik een UTF-8-servercodering. Stel optioneel LC_COLLATE = 'C' . in om op neutraal terrein te staan ​​of gebruik een sortering voor uw eerste taal om een ​​standaard sorteervolgorde te hebben. Begin met het lezen van het hoofdstuk Collatie-ondersteuning in de handleiding.

Ik raad je ten zeerste aan om de nieuwste versie van PostgreSQL (9.1 op het moment van schrijven) te gebruiken, omdat deze superieure sorteerondersteuning biedt.

Wat betreft de tabelstructuur :hou het simpel. Het klinkt alsof er een laag, vast aantal talen is om mee om te gaan. Je zou dan gewoon een kolom voor elke taal kunnen hebben:

CREATE TABLE txt (
  txt_id serial PRIMARY KEY
 ,txt    text NOT NULL -- master language NOT NULL?
 ,txt_fr text -- others can be NULL?
 ,txt_es text
 ,txt_de text
);

Dit is behoorlijk effectief, zelfs met veel talen. NULL-opslag is erg goedkoop.
Als je met een wisselend aantal talen te maken hebt, is een aparte tabel wellicht de betere oplossing. Deze oplossing gaat ervan uit dat je een "hoofdtaal" hebt, waarbij de string altijd aanwezig is:

CREATE TABLE txt (
  txt_id serial PRIMARY KEY
 ,txt    text NOT NULL -- master language NOT NULL?
);

CREATE TABLE lang (
  lang_abbr text PRIMARY KEY -- de, es, fr, ...
 ,lang      text NOT NULL
 ,note      text
);

Of, als een (tweeletterige) afkorting voldoende is, maak dan gewoon een enum typ om de taal te identificeren.

CREATE TABLE txt_trans (
  txt_id    int REFERENCES txt(txt_id) ON UPDATE CASCADE ON DELETE CASCADE
 ,lang_abbr text REFERENCES lang(lang_abbr) ON UPDATE CASCADE
 ,txt       text NOT NULL -- master language NOT NULL?
 ,CONSTRAINT txt_trans_pkey PRIMARY KEY (txt_id, lang_abbr)
);

Niet door de hoofdtaal speciaal te behandelen en alle taalvarianten in dezelfde tabel te houden, kan het hanteren in uw app eenvoudiger worden. Maar het hangt echt af van uw vereisten.




  1. Draaien van meerdere kolommen in T-SQL

  2. Hoe de trigger(s) te krijgen die zijn gekoppeld aan een weergave of een tabel in PostgreSQL

  3. waarom retourneert sum() query resultaat met meer decimalen?

  4. maak geformatteerde Excel-spreadsheet met MySQL-gegevens en PHP met behulp van tabellen