Ik heb een datamodel gebouwd waarin vertalingen in een translation memory (TM) worden gekoppeld aan talen. Dit model ziet er zo uit in het SQL-dialect van MySQL:
--
-- Languages
--
CREATE TABLE `oc_languages` (
`language_id` SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'LCID',
`parent_id` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '2057',
`name` VARCHAR(32) NOT NULL,
`iso_code` VARCHAR(5) NOT NULL,
`locale` VARCHAR(255) NOT NULL,
`image` VARCHAR(64) NOT NULL,
`sort_order` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
`status` TINYINT(1) UNSIGNED NOT NULL,
PRIMARY KEY (`language_id`),
KEY `fk_parent_id` (`parent_id`),
UNIQUE (`iso_code`),
KEY `name` (`name`),
CONSTRAINT `fk_parent_id` FOREIGN KEY (`parent_id`)
REFERENCES `oc_languages` (`language_id`)
ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
--
-- Translation Memory (TM)
--
CREATE TABLE `oc_translation_memory` (
`translation_id` VARCHAR(255) NOT NULL,
`language_id` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '2057',
`translation` TEXT NULL,
`is_admin_only` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
`last_modified` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY `pk_translation_id` (`translation_id`, `language_id`),
KEY `language_id` (`language_id`),
CONSTRAINT `fk_language_id` FOREIGN KEY (`language_id`)
REFERENCES `oc_languages` (`language_id`)
ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
So far, so good. Ik loop nu echter vast op een complicatie die ik nog heb ingebouwd. Het datamodel kent twee toestanden/beslissingsregels voor het bouwen van een language pack:
1. In bijvoorbeeld Hollands (nl-NL) en Vlaams (nl-BE) worden alleen verschillen met de master Standaardnederlands (nl) vastgelegd.
2. Ontbreekt ook daarin een vertaling, dan is er één algemene fallback, namelijk Brits Engels (en-GB).
Met andere woorden, wil je een language pack voor Hollands (nl-NL) maken, dan is dat een vereniging van drie verzamelingen:
1. Nederlands Nederlands (nl-NL)
2. Nederlands (nl)
3. Brits Engels (en-GB)
Om te voorkomen dat ik 3 queries uitvoer en daarna 3 keer een resultaat moet verwerken, wil ik een stored procedure schrijven die met de ISO-taalcode (zoals nl-NL) abstract dit kan doen:
SELECT
translation_id,
translation
WHERE
is_admin_only = 0
AND
iso_code = '...';
Hoe zou een stored procedure eruit moeten zien?