У меня есть таблица соединения двух таблиц, из которых одна имеет 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 нет единого столбца с первичным ключом. Это первичный ключ - это составной ключ.

Любое предложение??

0
shelholmes221 29 Окт 2019 в 20:07

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>
1
SteveDonie 29 Окт 2019 в 18:40