Привет, специалисты по проектированию баз данных stackoverflow!
Я столкнулся с проблемой проектирования в моей базе данных, и я не нашел подобной проблемы в Stackoverflow, отсюда и этот вопрос.
У меня есть таблица изображений, содержащая данные изображения и его первичный ключ. В моем дизайне на каждое изображение можно ссылаться несколько раз в нескольких таблицах.
Вот представление базы данных:
-------------------- -------------------------------------------
| image | | table1 |
|--------------------| |-------------------------------------------|
| id_image | data | | id_table1 | id_image | data |
|----------|---------| |-----------|----------|--------------------|
| 1 | Image 1 | | 1 | 1 | References image 1 |
| 2 | Image 2 | | 2 | 3 | References image 3 |
| 3 | Image 3 | -------------------------------------------
--------------------
-------------------------------------------
| table2 |
|-------------------------------------------|
| id_table2 | id_image | data |
|-----------|----------|--------------------|
| 1 | 2 | References image 2 |
| 2 | 2 | References image 2 |
| 3 | 3 | References image 3 |
-------------------------------------------
Вот детали таблицы:
- таблица изображений
- id_image автоинкрементный первичный ключ
- данные данные изображения
- table1 table
- id_table1 автоинкрементный первичный ключ
- id_image ссылка на внешний ключ
image.id_image
- данные данные таблицы1
- table2 table
- id_table2 автоинкрементный первичный ключ
- id_image ссылка на внешний ключ
image.id_image
- данные данные таблицы2
Я хочу, чтобы моя база данных вела себя следующим образом:
- Если я удаляю строку
table1
с id_table1 = 1
, строка изображения с id_image = 1
должна быть удалена (других ссылок на это изображение нет)
- Если я затем удаляю строку
table2
с id_table2 = 1
, ни одно изображение не должно быть удалено (потому что на изображение с id_image = 2
все еще ссылается строка table2
с id_table2 = 2
)
- Если я затем удаляю строку
table2
с id_table2 = 2
, строка изображения с id_image = 2
должна быть удалена (никаких других ссылок на это изображение)
- Если я затем удаляю строку
table1
с id_table1 = 2
, ни одно изображение не должно быть удалено (поскольку на изображение с id_image = 3
по-прежнему ссылается строка table2
с id_table2 = 3
)
- Если я затем удаляю строку
table2
с id_table2 = 3
, строка изображения с id_image = 3
должна быть удалена (других ссылок на это изображение нет)
Я уже пробовал несколько каскадного удаления, инвертируя внешние ключи (то есть таблицу image
, содержащую внешние ключи id_table1
и id_table2
), но если на изображение ссылаются в 2 других таблицах, удаляется одна ссылочная таблица. запись также удаляет изображение, которое я не хочу, чтобы это произошло.
Я также пытался определить триггеры, но этот подход более сложный, чем я думал: каждый раз, когда мне приходится проверять среди всех внешних ключей на id_image
, чтобы увидеть, есть ли другая ссылка на изображение, которое нужно удалить. Этот образец содержит 2 внешних ключа, но в создаваемой мной базе данных будет более 10 ...
Я чувствую, что есть простое решение этой простой проблемы, кто-нибудь здесь, чтобы помочь мне?
Спасибо!