Soo I’m working on a database that needs to support multiple languages (two for now, but who knows). I stumbled across this blog post that explains how to develop what it calls a “translation subschema” (haven’t seen it called like this anywhere else so I don’t know if it’s actually how you’d call it), which seems like a very nice way of dealing with things.
I’m not very experienced with DB stuff, so it took me a while to fully understand what it was doing, but now that (I think) I do, I’m wondering if I could just ignore the Languages
table, and just use a language
field in the tables TextContent
and Translations
, without loosing any functionality. (except of course having a table listing the available languages, which is not however something I’m interested in)
In my head everything would still work, I’d insert stuff with
INSERT INTO TextContent (OriginalText, OriginalLanguage)
VALUES ("Ciao", "it");
DECLARE TextContentId INT = SCOPE_IDENTITY();
INSERT INTO Translations (TextContentId, Language, Translation)
VALUES (@TextContentId, "it", "Ciao");
INSERT INTO Translations (TextContentId, Language, Translation)
VALUES (@TextContentId, "en", "Hello");
and given a TextContentId, i’d retrieve the correct translation with
SELECT Translation FROM Translations WHERE TextContentId = TCId AND Language = "en"
At this point, I’m thinking I could drop TextContent
too, and just have a Translations
table with TextContentId
, Language
, and Translation
, with (TextContentId
, Language
) as primary key.
Am I missing something? I’m trying to simplify this solution but I don’t want to risk making random errors.
Edit: translations on the DB are for user inserted text, which will also provide translations. The client then will only receive text it the correct language.
But why would I need that? (Onest question, I hope I don’t sound rude)
I mean, I could easily retrieve the list of available languages, and it makes it faster to delete them using an
ON DELETE CASCADE
(right?), but it also complicates stuff a bit for general useThat is how you end up with
en
,EN
,English
, etc.So you can dump just that table and send to translators. you also know all missing translations with one query. If you add more languages you don’t want to change all tables. All the normalization reasons apply too
None of those things necessarily require having a separate table for languages though.