PK 和 FK 建模问题
PK and FK Modeling Issues
我有一个 table (CONFIG_USERS
),用于存储用户在我们的产品上定义的配置信息。
PRODUCT_ID
标识我们的产品之一,USER_ID
标识用户,CONFIG_ID
标识配置,例如 'ALLOW_ANONYMOUS_LOGON'
。这些专栏在这个table.
上PK
现在,我想为我们拥有的各种语言的每个配置提供一个“用户友好名称”。
因此,我创建了 table DEF_CONFIG_LANGUAGES
,我们在其中唯一标识一种语言及其名称,例如 en-US | English
、pt-BR | Portugues Brasileiro
等。
现在,我需要为第三个 table 建模,我们将在其中存储每个可用配置的 用户友好描述 ,在 DEF_CONFIG_LANGUAGES 可用 ,像这样:
但我在如何正确建模这种关系方面遇到了麻烦。将 DEF_CONFIG_LANGUAGES_TO_DEF_CONFIGURATIONS_FK
建模为 'Non-Identifying' 关系使得 DEF_CONFIGURATIONS 上的 PK 仅为 CONFIG_ID 和 PRODUCT_ID,这不允许我在语言描述上添加更多内容CONFIG_ID。参见:
将 DEF_CONFIG_LANGUAGES_TO_DEF_CONFIGURATIONS_FK
设为 'Identifying FK',将 DEF_CONFIGURATIONS
上的 PK
设为 CONFIG_ID
、PRODUCT_ID
和 LANG_ID
,因此允许我向每个配置添加各种语言描述...但是,还在 table CONFIG_USERS
上添加 LANG_ID
列,这是不可取的,因为这些 table 存储独立于 locale/language.
的 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' 将根据 OS 当前语言环境动态加载,因此,我不希望 CONFIG_USERS [=81] 上的列 LANG_ID =].
也许我在这里遗漏了一些非常基本的东西,但我真的没有意识到在不违反任何推荐的数据库建模实践的情况下对其进行建模的正确方法。
非常感谢!
为了解决这个问题,我不得不讲述整个故事。
-- Language LNG exists.
--
language {LNG}
PK {LNG}
-- User USR prefers to communicate
-- in language LNG.
--
user {USR, LNG}
PK {USR}
FK {LNG} REFERENCES language {LNG}
-- Product PRO exists.
--
product {PRO}
PK {PRO}
-- User USR is allowed to use product PRO.
--
user_product {USR, PRO}
PK {USR, PRO}
FK1 {USR} REFERENCES user {USR}
FK2 {PRO} REFERENCES product {PRO}
-- Configuration parameter CFG exists.
--
config {CFG}
PK {CFG}
-- Configuration parameter CFG applies
-- to product PRO.
--
product_config {PRO, CFG}
PK {PRO, CFG}
FK1 {PRO} REFERENCES product {PRO}
FK2 {CFG} REFERENCES config {CFG}
-- User USR set configuration parameter CFG
-- of product PRO to value VAL.
--
user_product_config {USR, PRO, CFG, VAL}
PK {USR, PRO, CFG}
FK1 {PRO, CFG} REFERENCES
product_config {PRO, CFG}
FK2 {USR, PRO} REFERENCES
user_product {USR, PRO}
-- In language LNG, configuration parameter CFG
-- is named NME, described as DES, with help HLP.
--
config_language {CFG, LNG, NME, DES, HLP}
PK {CFG, LNG}
FK1 {CFG} REFERENCES config {CFG}
FK2 {LNG} REFERENCES language {LNG}
-- User USR set configuration parameter CFG
-- of product PRO to value VAL. In user's
-- preferred language LNG the parameter
-- is named NME, described as DES, with help HLP.
--
CREATE VIEW user_product_config_language
AS
SELECT a.USR
, a.PRO
, a.CFG
, a.VAL
, b.LNG
, c.NME
, c.DES
, c.HLP
FROM user_product_config AS a
JOIN user AS b ON b.USR = a.USR
JOIN config_language AS c ON c.CFG = a.CFG AND c.LNG = b.LNG ;
注:
All attributes (columns) NOT NULL
PK = Primary Key
AK = Alternate Key (Unique)
FK = Foreign Key
只是为了补充@Damir ,这是它的方法模型。
谢谢!
我有一个 table (CONFIG_USERS
),用于存储用户在我们的产品上定义的配置信息。
PRODUCT_ID
标识我们的产品之一,USER_ID
标识用户,CONFIG_ID
标识配置,例如 'ALLOW_ANONYMOUS_LOGON'
。这些专栏在这个table.
现在,我想为我们拥有的各种语言的每个配置提供一个“用户友好名称”。
因此,我创建了 table DEF_CONFIG_LANGUAGES
,我们在其中唯一标识一种语言及其名称,例如 en-US | English
、pt-BR | Portugues Brasileiro
等。
现在,我需要为第三个 table 建模,我们将在其中存储每个可用配置的 用户友好描述 ,在 DEF_CONFIG_LANGUAGES 可用 ,像这样:
但我在如何正确建模这种关系方面遇到了麻烦。将 DEF_CONFIG_LANGUAGES_TO_DEF_CONFIGURATIONS_FK
建模为 'Non-Identifying' 关系使得 DEF_CONFIGURATIONS 上的 PK 仅为 CONFIG_ID 和 PRODUCT_ID,这不允许我在语言描述上添加更多内容CONFIG_ID。参见:
将 DEF_CONFIG_LANGUAGES_TO_DEF_CONFIGURATIONS_FK
设为 'Identifying FK',将 DEF_CONFIGURATIONS
上的 PK
设为 CONFIG_ID
、PRODUCT_ID
和 LANG_ID
,因此允许我向每个配置添加各种语言描述...但是,还在 table CONFIG_USERS
上添加 LANG_ID
列,这是不可取的,因为这些 table 存储独立于 locale/language.
见:
这里的想法是构建一个像这样的 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' 将根据 OS 当前语言环境动态加载,因此,我不希望 CONFIG_USERS [=81] 上的列 LANG_ID =].
也许我在这里遗漏了一些非常基本的东西,但我真的没有意识到在不违反任何推荐的数据库建模实践的情况下对其进行建模的正确方法。
非常感谢!
为了解决这个问题,我不得不讲述整个故事。
-- Language LNG exists.
--
language {LNG}
PK {LNG}
-- User USR prefers to communicate
-- in language LNG.
--
user {USR, LNG}
PK {USR}
FK {LNG} REFERENCES language {LNG}
-- Product PRO exists.
--
product {PRO}
PK {PRO}
-- User USR is allowed to use product PRO.
--
user_product {USR, PRO}
PK {USR, PRO}
FK1 {USR} REFERENCES user {USR}
FK2 {PRO} REFERENCES product {PRO}
-- Configuration parameter CFG exists.
--
config {CFG}
PK {CFG}
-- Configuration parameter CFG applies
-- to product PRO.
--
product_config {PRO, CFG}
PK {PRO, CFG}
FK1 {PRO} REFERENCES product {PRO}
FK2 {CFG} REFERENCES config {CFG}
-- User USR set configuration parameter CFG
-- of product PRO to value VAL.
--
user_product_config {USR, PRO, CFG, VAL}
PK {USR, PRO, CFG}
FK1 {PRO, CFG} REFERENCES
product_config {PRO, CFG}
FK2 {USR, PRO} REFERENCES
user_product {USR, PRO}
-- In language LNG, configuration parameter CFG
-- is named NME, described as DES, with help HLP.
--
config_language {CFG, LNG, NME, DES, HLP}
PK {CFG, LNG}
FK1 {CFG} REFERENCES config {CFG}
FK2 {LNG} REFERENCES language {LNG}
-- User USR set configuration parameter CFG
-- of product PRO to value VAL. In user's
-- preferred language LNG the parameter
-- is named NME, described as DES, with help HLP.
--
CREATE VIEW user_product_config_language
AS
SELECT a.USR
, a.PRO
, a.CFG
, a.VAL
, b.LNG
, c.NME
, c.DES
, c.HLP
FROM user_product_config AS a
JOIN user AS b ON b.USR = a.USR
JOIN config_language AS c ON c.CFG = a.CFG AND c.LNG = b.LNG ;
注:
All attributes (columns) NOT NULL
PK = Primary Key
AK = Alternate Key (Unique)
FK = Foreign Key
只是为了补充@Damir
谢谢!