如何设计可以连接到多个不同表的本地化内容表(关系需要是通用的...)

时间:2010-09-21 11:58:24

标签: mysql database database-design localization relational-database

我知道这不是完全正常化的,但是将我的应用程序中的所有本地化数据整合到几个表中将会帮助我很多。

我必须能够将一些通用表链接到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;

第二种选择对我来说似乎更简洁,但它确实需要我加入两个看似有点奇怪的FK。它还需要大量额外的“localisedGroupID”列。

最终我给出的两个例子都可能是错的,我没有专业知识来了解最佳解决方案。 (在你指出这没有完全规范化之前,我已经说过我不希望每个表都有数百个不同的本地化数据表......我确实希望对本地化进行一定程度的集中化,即使它会失去一点参考诚信。)

想法?

2 个答案:

答案 0 :(得分:1)

您的架构让我想起了网络上可用的“泛化专业化关系建模”示例,但有一个重要区别。

你所谓的AnExampleOfAGenericTable和AnotherGenericTable对应于gen-spec模式中的专用表,你所调用的LocalisedContent对应于gen-spec模式中的通用表。

如果我理解你,前两个表中的每个条目都将在LocalisedContent表中具有对应项,但LocalisedContent表中的条目将仅在其他两个表中的一个中具有对应项。这与gen-spec完全相同,只是倒退。

在gen-spec设计中,您在通用表中使用的所有专用表中使用相同的PK。但是,专用表中的PK也是广义表的FK。当然,您只在gen表中使用自动编号功能。

没有什么关于gen-spec的非正常化。

答案 1 :(得分:0)

我们使用以下内容:

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)

GenericTable是(Id,Name,Description)