【问题标题】:PK and FK Modeling IssuesPK 和 FK 建模问题
【发布时间】:2021-03-20 05:47:31
【问题描述】:

我有一个表 (CONFIG_USERS),其中存储有关用户在我们产品上定义的配置的信息。 PRODUCT_ID 标识我们的产品之一,USER_ID 标识用户,CONFIG_ID 标识配置,例如 'ALLOW_ANONYMOUS_LOGON'。这些列是此表上的 PK。

现在,我想为我们拥有的每个配置提供一个“用户友好名称”,使用各种语言。

所以,我创建了表 DEF_CONFIG_LANGUAGES,我们在其中唯一标识了一种语言及其名称,例如 en-US | Englishpt-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_IDPRODUCT_IDLANG_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


    【解决方案1】:

    为了解决这个问题,我不得不讲述整个故事。


    -- 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
    

    【讨论】:

      【解决方案2】:

      只是为了补充@Damir answer,这是它的方法的模型。

      谢谢!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-02
        • 1970-01-01
        相关资源
        最近更新 更多