таблицы поиска только для отношений один к одному? - PullRequest
1 голос
/ 09 марта 2012

Рекомендуется ли использовать таблицу lookup для хранения 1: 1 отношений только между таблицами?

Например

system таблица

system_id
name
etc

path таблица

path_id
value

таблица lookup - таблица system_has_path,

system_id
path_id

У меня есть другие таблицы для связи с таблицей path, например,

page стол,

page_id
title
etc

lookup таблица page_has_path,

page_id
path_id

элемент / строка page или элемент / строка system всегда будут иметь только один путь на строку . Конечно, иногда у них нет пути, поэтому я хочу разделить путь в отдельную таблицу.

Причина, по которой я использую таблицы поиска для них, заключается в том, что я не хочу хранить FK в таблице path и в конечном итоге получается вот так:

path_id   value   page_id   system_id    post_id    news_id
1         a.php   1         NULL         NULL       NULL
2         b.php   NULL      1            NULL       NULL
3         c.php   NULL      2            NULL       NULL

выглядит довольно некрасиво с большим количеством полей NULL или empty.

или если у вас есть другие лучшие решения / практика?

Ответы [ 4 ]

2 голосов
/ 10 марта 2012

В противоположность другим ответам, да, это (наиболее) нормализованный подход.Преимущества:

  • В ваших столбцах нет пустых значений.

  • Если позже вы захотите добавить ссылку на внешний ключ из другой таблицы вsystem_has_path (к системам, которые имеют путь, а не к какой-либо системе) или к page_has_path, вы можете сделать это легко, не меняя существующие таблицы.

1 голос
/ 09 марта 2012

Я не вижу проблем при использовании одной таблицы (даже с большим количеством значений NULL внутри).Такой подход избавит вас от необходимости добавлять дополнительные JOIN к вашим SELECT запросам.

Вы можете использовать несколько таблиц поиска, но затем использовать индекс UNIQUE для обоих столбцов FK, чтобы избежать дублирования (поскольку вы заявляете, что все ваши отношения взаимно однозначны).

0 голосов
/ 09 марта 2012

Если вы делаете все это просто для предотвращения значений NULL в столбцах path_id, то я говорю, не беспокойтесь о значениях NULL.

Однако, если вы не возражаете против сложности дляради нормализации и хотите сохранить путь в своей собственной таблице, но не хотите соединительных таблиц для отношений 1 к 1, затем рассмотрите следующий подход.

Где первичный ключ - (id, path_type):

path table
----------------
id      path_type    value
1       page         a.php
1       system       b.php
2       system       c.php

Вот запрос для этого:

SELECT *
FROM page
LEFT JOIN path
  ON path.id = page.page_id AND path.path_type = 'page'
0 голосов
/ 09 марта 2012

Предположительно, ваша таблица сообщений (например):

posts(id, path_id, etc..)

Почему вы не используете это?

...