abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
eParkomat, startup z ČR, postoupil mezi finalisty evropského akcelerátoru ChallengeUp!
Robot na pivo mu otevřel dveře k opravdovému byznysu
Internet věcí: Propojený svět? Už se to blíží...
dnes 06:00 | Zajímavý software

OMG! Ubuntu! představuje emulátor terminálu Hyper (GitHub) postavený na webových technologiích (HTML, CSS a JavaScript). V diskusi k článku je zmíněn podobný emulátor terminálu Black Screen. Hyper i Black Screen používají framework Electron, stejně jako editor Atom nebo vývojové prostředí Visual Studio Code.

Ladislav Hagara | Komentářů: 16
dnes 06:00 | Zajímavý článek

I letos vychází řada ajťáckých adventních kalendářů. QEMU Advent Calendar 2016 přináší každý den nový obraz disku pro QEMU. Programátoři se mohou potrápit při řešení úloh z kalendáře Advent of Code 2016. Kalendáře Perl Advent Calendar 2016 a Perl 6 Advent Calendar přinášejí každý den zajímavé informace o programovacím jazyce Perl. Stranou nezůstává ani programovací jazyk Go.

Ladislav Hagara | Komentářů: 4
3.12. 16:24 | Nová verze

Byla vydána Mageia 5.1. Jedná se o první opravné vydání verze 5, jež vyšla v červnu loňského roku (zprávička). Uživatelům verze 5 nepřináší opravné vydání nic nového, samozřejmě pokud pravidelně aktualizují. Vydání obsahuje všechny aktualizace za posledního téměř půldruhého roku. Mageia 5.1 obsahuje LibreOffice 4.4.7, Linux 4.4.32, KDE4 4.14.5 nebo GNOME 3.14.3.

Ladislav Hagara | Komentářů: 11
3.12. 13:42 | Pozvánky

V Praze probíhá konference Internet a Technologie 16.2, volné pokračování jarní konference sdružení CZ.NIC. Konferenci lze sledovat online na YouTube. K dispozici je také archiv předchozích konferencí.

Ladislav Hagara | Komentářů: 0
2.12. 22:44 | Komunita

Joinup informuje, že Mnichov používá open source groupware Kolab. V srpnu byl dokončen dvouletý přechod na toto řešení. V provozu je asi 60 000 poštovních schránek. Nejenom Kolabu se věnoval Georg Greve ve své přednášce Open Source: the future for the European institutions (SlideShare) na konferenci DIGITEC 2016, jež proběhla v úterý 29. listopadu v Bruselu. Videozáznam přednášek z hlavního sálu je ke zhlédnutí na Livestreamu.

Ladislav Hagara | Komentářů: 25
2.12. 15:30 | Zajímavý projekt

Společnost Jolla oznámila v příspěvku Case study: Sailfish Watch na svém blogu, že naportovala Sailfish OS na chytré hodinky. Využila a inspirovala se otevřeným operačním systémem pro chytré hodinky AsteroidOS. Použita je knihovna libhybris. Ukázka ovládání hodinek na YouTube.

Ladislav Hagara | Komentářů: 10
2.12. 14:15 | Nová verze

Byla vydána verze 7.1.0 skriptovacího jazyka PHP používaného zejména k vývoji dynamických webových stránek. Jedná se o první stabilní verzi nejnovější větvě 7.1. Přehled novinek v dokumentaci. Podrobnosti v ChangeLogu. K dispozici je také příručka pro přechod z PHP 7.0.x na PHP 7.1.x.

Ladislav Hagara | Komentářů: 4
2.12. 12:55 | Nová verze

Google Chrome 55 byl prohlášen za stabilní. Nejnovější stabilní verze 55.0.2883.75 tohoto webového prohlížeče přináší řadu oprav a vylepšení (YouTube). Opraveno bylo také 36 bezpečnostních chyb. Mariusz Mlynski si například vydělal 22 500 dolarů za 3 nahlášené chyby (Universal XSS in Blink).

Ladislav Hagara | Komentářů: 4
2.12. 11:55 | Pozvánky

Máte rádi svobodný software a hardware nebo se o nich chcete něco dozvědět? Přijďte na 135. sraz spolku OpenAlt, který se bude konat ve čtvrtek 8. prosince od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Sraz bude tentokrát tématický. Bude retro! K vidění budou přístroje jako Psion 5mx nebo Palm Z22. Ze svobodného hardwaru pak Openmoko nebo čtečka WikiReader. Přijďte se i vy pochlubit svými legendami, nebo alespoň na pivo. Moderní hardware má vstup samozřejmě také povolen.

xkucf03 | Komentářů: 1
2.12. 00:10 | Nová verze

Byla vydána verze 3.2 svobodného systému pro detekci a prevenci průniků a monitorování bezpečnosti počítačových sítí Suricata. Z novinek lze zmínit například podporu protokolů DNP3 a CIP/ENIP, vylepšenou podporu TLS a samozřejmě také aktualizovanou dokumentaci.

Ladislav Hagara | Komentářů: 0
Kolik máte dat ve svém domovském adresáři na svém primárním osobním počítači?
 (32%)
 (24%)
 (29%)
 (7%)
 (5%)
 (3%)
Celkem 773 hlasů
 Komentářů: 50, poslední 29.11. 15:50
Rozcestník
Reklama

Dotaz: Vícejazyčná data v databázi

Josef Kufner avatar 28.8.2008 18:37 Josef Kufner | skóre: 66
Vícejazyčná data v databázi
Přečteno: 1042×
Ahoj,
potřebuju uložit do databáze data v několika jazycích. Některá data jsou všem jazykovým verzím společná (např. datumy, číselné hodnoty, adresy, atp.), některá ne (texty ;-)). Co jsem tak koukal na různé články na toto téma, tak píšou akorát o tom, jak je jedno řešení horší než druhé... Takže vím jak to neudělat, ale nevím jak to udělat :-( Jako databáze bude použita MySQL, chci aby byly respektovány zvyklosti v řazení u každého jazyka a nebylo to moc slozité (jak pro mě, tak pro server). Máte nějaké nápady, zkušenosti, odkazy, cokoliv?
Hello world ! Segmentation fault (core dumped)

Odpovědi

28.8.2008 20:31 Dejv | skóre: 36 | blog: Jak ten blog nazvat ... ? | Ostrava
Rozbalit Rozbalit vše Re: Vícejazyčná data v databázi
Ahoj.

Kdysi jsem resil nekolik jazykovych variant webovek, ale skoncilo to u titulni stranky (ta byla staticka), dal se ten projekt nedostal (nikoli mou vinou). Ale i ta titulka byla pochopitelne lokalizovana.

Texty byly rozdeleny do casti, delicim prvkem byly html tagy (odstavce, obrazky, spany a pod.) - tyto tagy ale byly jen ve skriptu, kterym byla vysledna stranka tvorena, v databazi byly jen textove prvky. Kazdy takovyto blok textu mel svoje ID a poradove_cislo, kde ID odpovidalo strance a poradove_cislo udavalo poradi toho bloku v html zdrojaku stranky. Zaznamy se stejnym ID a poradove_cislo predstavovaly pokazde stejny kus textu, jen v jinem jazyce.

Takze jsem udelal neco jako

select txt from texty where ID=id_stranky order by poradi
a pak do html zdrojaku v patricnych mistech postupne vkladal nactene zaznamy. A lokalizace bylo udelana tak, ze kazda jazykova mutace mela svuj vlastni sloupec v databazi, takze dotaz pro cesky jazyk byl
select txt_cs ...
pro anglictinu
select txt_en ...
pro nemcinu
select txt_de ...
atd. Pridani jazyka znamenalo pridani sloupce do databaze.

Jsem si vedom, ze to urcite neni ten nejlepsi zpusob, ale mi proste v danou chvili pro dany ucel s danymi prostredky vyhovoval... Navic se jednalo o vice-mene staticke stranky, coz asi neni vas pripad.


Dejv
Pevne verim, ze zkusenejsi uzivatele me s mymi napady usmerni a poslou tam, kam tyto napady patri...
29.8.2008 09:30 vratidlo007 | skóre: 20
Rozbalit Rozbalit vše Re: Vícejazyčná data v databázi
Ahoj, ja bych to resil nasledujicim zpusobem: lang: lang_id, lang_dsc label: label_id, lang_id, label_value

select label_id, label_value from lang inner join label on lang_id where lang_id = ?

Tabulky propojis a mas krasny, cisty reseni, ktery neni zatezi ani pro server (join mu az tak neublizi), ani pro tebe (bude se ti hezky spravovat data). Otazkou zustava co pro spolecna data. Bud mit defaultni jazyk a resit to v aplikacni vrstve (nehezky) nebo udelat komplikoanejsi dotaz pro dane view co ti bude generovat data pro danou stranku.
default avatar 30.8.2008 22:19 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Vícejazyčná data v databázi
Ahoj,

já to řešil a vyřešil. Mám řešení pro Oracle, které je díky Oraclu jednoduché, a pak pro PostgreSQL, které je vysoce netriviální. Ale v podstatě jsem do PostgreSQL dostal věci, které jsou u Oracle samozřejmostí :-)

Takže, jestli máš zájem, můžu trošku odtajnit default's proprietary :-D
Josef Kufner avatar 30.8.2008 22:44 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: Vícejazyčná data v databázi
Hurá, prosím prosím, smutně koukám ;-)
Hello world ! Segmentation fault (core dumped)
default avatar 31.8.2008 20:14 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Vícejazyčná data v databázi
OKi, tak začneme.

Požadavky

  • ukládání dat ve více jazycích
  • řazení těchto dat podle zvyklostí daného locale
  • jednoduchost pro databázi i aplikační server
Začnu tím třetím, tedy jednoduchostí. Vrchol jednoduchosti vídím v Oracle:
CREATE TABLE loc_test (
    lt_text NVARCHAR2(64))
/

INSERT INTO loc_test (lt_text) VALUES ('Petr')
/
INSERT INTO loc_test (lt_text) VALUES ('František')
/
INSERT INTO loc_test (lt_text) VALUES ('Áron')
/
INSERT INTO loc_test (lt_text) VALUES ('Antonín')
/
INSERT INTO loc_test (lt_text) VALUES ('Petříček')
/

COMMIT
/

ALTER SESSION SET NLS_SORT = CZECH_AI
/

SELECT
    lt_text
FROM
    loc_test
ORDER BY
    lt_text
/

ALTER SESSION SET NLS_SORT = ASCII7
/

SELECT
    lt_text
FROM
    loc_test
ORDER BY
    lt_text
/

SELECT
    lt_text
FROM
    loc_test
ORDER BY
    NLSSORT(lt_text, 'NLS_SORT = CZECH_AI')
/

DROP TABLE loc_test
/
Použití je velmi jednoduché. Ve výsledku je vidět, že to skutečně funguje tak, jak chceme:
CREATE TABLE succeeded.
1 rows inserted
1 rows inserted
1 rows inserted
1 rows inserted
1 rows inserted
COMMIT succeeded.
ALTER SESSION SET succeeded.
LT_TEXT                                                          
---------------------------------------------------------------- 
Antonín                                                          
Áron                                                             
František                                                        
Petr                                                             
Petříček                                                         

5 rows selected

ALTER SESSION SET succeeded.
LT_TEXT                                                          
---------------------------------------------------------------- 
Antonín                                                          
František                                                        
Petříček                                                         
Petr                                                             
Áron                                                             

5 rows selected

LT_TEXT                                                          
---------------------------------------------------------------- 
Antonín                                                          
Áron                                                             
František                                                        
Petr                                                             
Petříček                                                         

5 rows selected

DROP TABLE loc_test succeeded.
Tak! A jak něco podobného udělat například v PostgreSQL? PostgreSQL umožňuje nastavit locale při vytváření databáze. Což je docela slabé. Proto jsem došel k následujícímu řešení, které je optimalizované na maximální výkon pro SELECT (to byl požadavek) a jednoduchost volání jako v Oracle.

Základní schéma

Na začátku je tabulka LOCALES, která funguje jako číselník podporovaných locales. Jednotlivá locale se zadávají v Javí notaci, tedy JAZYK_ZEMĚ_VARIANTA. Pak tam jsou naimplementované funkce, které umějí dohledat locale stejně tak, jak to dělá Java (java.util.ResourceBundle). Další tabulkou je tabulka TABLES, která ukládá názvy tabulek, které jsou pod lokalizací. Všechny funkce, které nějak mohou afektovat data (například přidání locale, odebrání locale), díky této tabulce automaticky přidávají nové jazyky. Úplně vespod jsou funkce pro podporu uživatelských proměnných v session, implementace chybějících funkcí PL/PgSQL a tak.

Data pod lokalizací

Základem jsou tři tabulky. Tabulka se suffixem _C, která ukládá nelokalizované atributy, další se suffixem _L, která ukládá lokalizovaná data a poslední se suffixem _D, která drží stav NULL, NOT NULL pro lokalizovaná data. Příklad:
CREATE TABLE i18n.example_c (
        exmp_id bigint DEFAULT nextval('sq_exmp_id') NOT NULL,
        exmp_type bigint NOT NULL,
        exmp_creation_time timestamp with time zone NOT NULL DEFAULT NOW()
);

ALTER TABLE i18n.example_c ADD CONSTRAINT pk_exmp_id PRIMARY KEY (exmp_id);


CREATE TABLE i18n.example_l (
        exmp_entity bigint NOT NULL,
        exmp_locale bigint NOT NULL,
        exmp_name varchar NULL,
        exmp_value varchar NULL,
        exmp_value_ord bytea NULL
);

ALTER TABLE i18n.example_l ADD CONSTRAINT pk_exmp_entity_exmp_locale PRIMARY KEY (exmp_entity, exmp_locale);
ALTER TABLE i18n.example_l ADD CONSTRAINT fk_exmp_entity_exmp_id FOREIGN KEY (exmp_entity) REFERENCES i18n.example_c (exmp_id) ON DELETE CASCADE;
ALTER TABLE i18n.example_l ADD CONSTRAINT fk_exmp_locale_locale_id FOREIGN KEY (exmp_locale) REFERENCES i18n.locale (id);


CREATE TABLE i18n.example_d (
        column_name varchar NOT NULL,
        nullable boolean NOT NULL
);

ALTER TABLE i18n.example_d ADD CONSTRAINT pk_example_d PRIMARY KEY (column_name);
Pak si nadefinuješ pohledy, které celou tuto strukturu zobrazí jako jednu tabulku:
CREATE VIEW i18n.example AS
SELECT
                c.exmp_id,
                c.exmp_type,
                c.exmp_creation_time,
                l.exmp_locale,
                l.exmp_name,
                l.exmp_value,
                l.exmp_value_ord
        FROM
                example_c c INNER JOIN example_l l ON (c.exmp_id = l.exmp_entity)
        WHERE
                l.exmp_locale = i18n.get_session_locale_id();


CREATE VIEW i18n.example_a AS
SELECT
                c.exmp_id,
                c.exmp_type,
                c.exmp_creation_time,
                l.exmp_locale,
                l.exmp_name,
                l.exmp_value,
                l.exmp_value_ord
        FROM
                example_c c INNER JOIN example_l l ON (c.exmp_id = l.exmp_entity);
Ta view se suffixem _A zobrazují veškeré locales (nejsou omezena na aktuální locale v session). Jak je vidět, pro každý řádek v tabulce EXAMPLE_C je v tabulce EXAMPLE_L vygenerován speciální řádek pro každé locale. Když přidáš další locale, "systém" automaticky do všech těchto kompozitů dogeneruje prázdné řádky.

Řazení

Tak, to byla struktura. Abychom mohli řadit v závislosti na locale, potřebujeme collation key. Ten spočítáme podle locale například Javou (třídy java.util.Locale a java.text.Collator). Získaný collation key uložíme do sloupku EXMP_VALUE_ORD v tabulce EXAMPLES_L a pak jen tento sloupek uvedeme v ORDER BY klauzuli. Jak jednoduché, že?

Jen precizní je dostatečně dobré

Nakonec napíšeme tři funkce, které pomocí RULEs zaregistrujeme jako Oraclí INSTEAD OF — TRIGGERy na ta VIEWs, které za nás automaticky při INSERTu nebo UPDATE přepočítají collation key. Ve všech dotazech tedy používáme vlastně jen ta VIEWs, protože se díky pravidlům chovají jako opravdové tabulky.


Takže — namísto Oraclího ALTER SESSION SET NLS_SORT… zavoláš i18n.set_session_locale(…) dál používáš databázi, jak je třeba. Když potřebuješ řadit jinak, buď zavoláš set_session_locale znovu, nebo si napíšeš vlastní ORDER BY klauzuli.
Josef Kufner avatar 31.8.2008 21:19 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: Vícejazyčná data v databázi
Díky, myslím, že jsi mi právě vyřešil i několik dalších problémů, na které jsem se ani neptal :-D Máš u mě čokoládu (příp. pivo).
Hello world ! Segmentation fault (core dumped)
default avatar 31.8.2008 22:35 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Vícejazyčná data v databázi
Díky, myslím, že jsi mi právě vyřešil i několik dalších problémů, na které jsem se ani neptal :-D
Já vím. Jsem za to placenej :-D
Máš u mě čokoládu (příp. pivo).
Já radši vodku. Teď tady cucám lahvinku Stolichnayi :-D
Ale zpět k databázím. Na implementaci těch funkcí je asi nejlepší právě ta Java. Když se vyhneš proměnným prostředí, bude ti stačit ICU od IBM, které se dělá i v C (možná je to C++, nevím). A konec konců ty session variables by šly také napsat přímo v C, ale proč, když v Javě jsou to dva řádky, že? :-D
Josef Kufner avatar 1.9.2008 00:16 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: Vícejazyčná data v databázi
No, ono je okolo tohohle ještě dalších 30K řádků v PHP a MySQL, takže asi tak ;-)

Když jsem hledal jak v php vyrobit hodnoty do sloupečku pro řazení, zjistil jsem, že MySQL umí to co Oracle, jen se trochu bojím neefektivního indexování (ale to by se mohlo dohnat kešováním).

Ještě domyslet pár detailů a bude to stačit už jen napsat :-D
Hello world ! Segmentation fault (core dumped)
default avatar 7.9.2008 17:39 default | skóre: 22 | Madrid
Rozbalit Rozbalit vše Re: Vícejazyčná data v databázi
Nechceš udělat nějaký souhrn, jak jsi to vyřešil? Třeba by to mohlo někomu pomoci…
Josef Kufner avatar 7.9.2008 19:25 Josef Kufner | skóre: 66
Rozbalit Rozbalit vše Re: Vícejazyčná data v databázi
Jo, dám sem pak řešení, ale ještě to není hotové, takže nevím jak moc to bude fungovat. Musím okolo toho vytvořit několik dalších věcí, než to začne něco užitečného dělat ;-)
Hello world ! Segmentation fault (core dumped)

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267   www.czech-server.cz
© 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.