Как создать таблицу локализованного содержимого, которая может объединяться с несколькими различными таблицами (взаимосвязь должна быть общей ...) - PullRequest
1 голос
/ 21 сентября 2010

Я знаю, что это не совсем нормализовано, но перенос всех локализованных данных всего моего приложения в несколько таблиц мне очень поможет.

Я должен быть в состоянии связать некоторые общиетаблица к таблице LocalisedContent, которая будет содержать разные строки для каждой из локализованных пар ключ-значение общей таблицы, присоединенной к ней ... Я думаю, вы могли бы сказать, что это будет отношение один ко многим.

Проблема, которую я обнаружил, заключается в том, что я не уверен, как лучше всего смоделировать это ... Я могу придумать два пути, и я не уверен, какой из них лучше:

Мой первый вариант:

AnExampleOfAGenericTable
------------
AnExampleOfAGenericTableID
...other non-localised data...

AnotherGenericTable
------------
AnotherGenericTableID
...other non-localised data...

LocalisedContent
----------------
LocalisedContentID
genericTablePKName
GenericTableID
LanguageID
field
content

Выше можно было бы получить локализованное содержимое для универсальной таблицы с помощью SQL-запроса, например:

    SELECT AnExampleOfAGenericTableID, field, content 
    FROM AnExampleOfAGenericTable LEFT JOIN LocalisedContent 
    ON AnExampleOfAGenericTable.AnExampleOfAGenericTableID =        
    LocalisedContent.GenericTableID 
    WHERE genericTablePKName = 'AnExampleOfAGenericTableID'

Или:

    SELECT AnotherGenericTableID, field, content 
    FROM AnotherGenericTable LEFT JOIN LocalisedContent 
    ON AnotherGenericTable.AnotherGenericTableID = LocalisedContent.GenericTableID
    WHERE genericTablePKName = 'AnotherGenericTableID'

Второй вариант выглядит примерно так:

AnExampleOfAGenericTable
------------
AnExampleOfAGenericTableID
...other non-localised data...
localisedGroupID

AnotherGenericTable
------------
AnotherGenericTableID
...other non-localised data...
localisedGroupID

LocalisedContent
----------------
LocalisedContentID
localisedGroupID
LanguageID
field
content

И тогда я мог бы использовать запрос SQL, например:

 SELECT AnExampleOfAGenericTableID, field, content 
 FROM AnExampleOfAGenericTable LEFT JOIN LocalisedContent 
 ON AnExampleOfAGenericTable.localisedGroupID = LocalisedContent.localisedGroupID;

Или:

 SELECT AnotherGenericTableID, field, content 
 FROM AnotherGenericTable LEFT JOIN LocalisedContent 
 ON AnotherGenericTable.localisedGroupID = LocalisedContent.localisedGroupID;

Второй вариант мне кажется более лаконичным, но он требует, чтобы я присоединился к двум ФКчто кажется немного странным.Это также требует большого количества дополнительных столбцов «localisedGroupID».

В конечном итоге оба приведенных мной примера могут быть ошибочными, и у меня нет опыта, чтобы узнать лучшее решение для этого.(Прежде чем вы отметите, что это не полностью нормализовано, я уже сказал, что не хочу, чтобы сотни разных локализованных таблиц данных для каждой из моих таблиц ... Я действительно хочу некоторой степени централизации в локализации, даже если онапотеряет меня немного ссылочной целостности.)

Идеи?

Ответы [ 2 ]

1 голос
/ 21 сентября 2010

Ваша схема напоминает мне примеры «реляционного моделирования специализации обобщения», доступные в Интернете, с одним важным отличием.

То, что вы называете AnExampleOfAGenericTable и AnotherGenericTable, соответствует специализированным таблицам в шаблоне gen-spec, а то, что вы называете LocalisedContent, соответствует обобщенной таблице в шаблоне gen-spec.

Если я правильно вас понял, у каждой записи в первых двух таблицах будет аналог в таблице LocalisedContent, но у записи в таблице LocalisedContent будет аналог только в одной из двух других таблиц. Это точно такой же шаблон, как у gen-spec, только в обратном направлении.

В проекте gen-spec вы используете один и тот же PK во всех специализированных таблицах, которые вы используете в обобщенной таблице. Однако PK в специализированной таблице также является FK для обобщенной таблицы. И, конечно, вы используете только функцию автонумерации в таблице gen.

Нет ничего ненормального в gen-spec как таковой.

0 голосов
/ 21 сентября 2010

Мы используем следующее:

LocalizedContent:

Id   - identity
Key  - format 'TableName.ColumnName'
Value - localized value 
LanguageId - reference to the languageid
TableRowId - generic table row id

Где введите формат 'TableName.ColumnName'

использование:

SELECT IFNULL(lc1.Value, name) as Name,  
       IFNULL(lc2.Value, Description) as Description
From GenericTable t 
LEFT JOIN LocalizedContent lc1
   ON (lc1.TableRowId = t.Id AND Key = 'GenericTable.Name' And LanguageID = YourLangId)
LEFT JOIN LocalizedContent lc2 
   ON (lc2.TableRowId = t.Id AND Key = 'GenericTable.Description' And LanguageID = YourLangId)

Общая таблица (Id, Name, Description)

...