【问题标题】:How to set multiple foreign keys in the liquibase changesets?如何在 liquibase 变更集中设置多个外键?
【发布时间】:2019-10-29 17:07:10
【问题描述】:

我有一个包含两个表的连接表,其中一个以 id 作为主键,但另一个有 3 列作为主键,基本上是复合主键。 现在,在连接表上,我应该引用哪一列,或者更准确地说,在编写变更集时如何将多个列引用为外键。

这是表格:

<changeSet id="Create X table">
 <createTable tableName="X">
  <column name="SERVICE" type="VARCHAR(50)">
    <constraints primaryKey="true"/>
  </column>
  <column name="ACTION" type="VARCHAR(50)">
    <constraints primaryKey="true"/>
  </column>
  <column name="TARGET" type="VARCHAR(50)">
    <constraints primaryKey="true"/>
  </column>
 </createTable>
</changeSet>

第二张桌子:

<changeSet id="Create Y table">
<createTable tableName="Y">
  <column name="ID" type="VARCHAR(36)">
    <constraints primaryKey="true" primaryKeyName="XPKY"/>
  </column>
  <column name="NAME" type="VARCHAR(50)">
    <constraints nullable="false" unique="true"/>
  </column>
</createTable>

加入的表:

 <changeSet id ="Create X_Y_REL table">
<createTable tableName="X_Y_REL">
  <column name="Y_NAME" type="VARCHAR(50)">
    <constraints nullable="false" referencedTableName="Y" referencedColumnNames="NAME"
                 foreignKeyName="XFK1X_Y_REL"/>
  </column>
  <column name="X_ID" type="VARCHAR(150)">
    <constraints nullable="false" referencedTableName="X" referencedColumnNames="?????"
                 foreignKeyName="XFK2_X_Y_REL"/>
  </column>
</createTable>

所以,我不知道在此处放置什么作为引用的列名,因为表 X 中没有单个主键列。它的主键是复合键。

有什么建议吗??

【问题讨论】:

    标签: java jpa liquibase


    【解决方案1】:

    这更像是一个数据库设计问题,而不是 Liquibase 问题,但这是我对此的看法。

    您可能应该只向每个表添加一个整数或 UUID 列以用作代理主键。从长远来看,这将使您和任何追随您的人变得更容易。然后始终使用该键作为外键关系。

    如果您还希望数据库强制要求某些列组合对于数据库的每一行也必须是唯一的,您也可以这样做,但这是一个单独的问题。

    如果您不想添加代理主键,那么在您的第三个变更集中,您可以引用构成复合键的多个列名,并用逗号分隔它们。它看起来像这样:

    <changeSet id ="Create X_Y_REL table" author="Steve">
       <createTable tableName="X_Y_REL">
         <column name="Y_NAME" type="VARCHAR(50)">
           <constraints nullable="false" referencedTableName="Y" referencedColumnNames="NAME"
                        foreignKeyName="XFK1X_Y_REL"/>
         </column>
         <column name="X_ID" type="VARCHAR(150)">
           <constraints nullable="false" referencedTableName="X" referencedColumnNames="SERVICE,ACTION,TARGET"
                        foreignKeyName="XFK2_X_Y_REL"/>
         </column>
      </createTable>
    </changeSet>
    

    【讨论】:

    • 我同意使用复合主键会变得混乱,应该避免使用。但是使用整数、UUID 或其他一些在没有先选择行的情况下无法确定的值可能同样难以使用。相反,您可以使用确定性的东西,例如复合值的散列。当然,理想的架构取决于您的访问模式 YMMV。
    猜你喜欢
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 2022-06-22
    • 2019-02-18
    • 2021-03-27
    • 2020-04-29
    • 2016-10-05
    相关资源
    最近更新 更多