【发布时间】:2021-03-20 05:47:31
【问题描述】:
我有一个表 (CONFIG_USERS),其中存储有关用户在我们产品上定义的配置的信息。
PRODUCT_ID 标识我们的产品之一,USER_ID 标识用户,CONFIG_ID 标识配置,例如 'ALLOW_ANONYMOUS_LOGON'。这些列是此表上的 PK。
现在,我想为我们拥有的每个配置提供一个“用户友好名称”,使用各种语言。
所以,我创建了表 DEF_CONFIG_LANGUAGES,我们在其中唯一标识了一种语言及其名称,例如 en-US | English、pt-BR | Portugues Brasileiro 等等。
现在,我需要为第三张表建模,我们将在其中存储每个可用配置的用户友好描述,在 DEF_CONFIG_LANGUAGES 上的每种可用语言,类似于这个:
但我在如何正确建模这种关系方面遇到了麻烦。将DEF_CONFIG_LANGUAGES_TO_DEF_CONFIGURATIONS_FK 建模为“非识别”关系使得 DEF_CONFIGURATIONS 上的 PK 仅为 CONFIG_ID 和 PRODUCT_ID,这不允许我为 CONFIG_ID 添加超过语言描述的内容。见:
将DEF_CONFIG_LANGUAGES_TO_DEF_CONFIGURATIONS_FK 设为“识别FK”,使DEF_CONFIGURATIONS 上的PK 成为CONFIG_ID、PRODUCT_ID 和LANG_ID,从而允许我为每个配置添加各种语言描述。 .. 但是,还要在表 CONFIG_USERS 上添加 LANG_ID 列,这是不可取的,因为这些表存储独立于语言环境/语言的 config_values。
这里的想法是构建一个如下所示的 SQL:
SELECT A.CONFIG_ID, A.CONFIG_VALUE, B.CONFIG_NAME, B.CONFIG_DESCRIPTION, B.CONFIG_HELP
FROM CONFIG_USERS A
LEFT JOIN DEF_CONFIGURATIONS B
ON B.PRODUCT_ID = A.PRODUCT_ID
AND B.CONFIG_ID = A.CONFIG_ID
AND B.LANG_ID = :langId
WHERE A.PRODUCT_ID = :productID and A.USER_ID = :userID;
参数 'langId' 将根据操作系统当前语言环境动态加载,因此,我不希望 CONFIG_USERS 表中的 LANG_ID 列。
也许我在这里遗漏了一些非常基本的东西,但我真的没有意识到在不违反任何推荐的数据库建模实践的情况下进行建模的正确方法。
非常感谢!
【问题讨论】:
标签: mysql database-design data-modeling