Я создал таблицу (t_subject), как это
| id | description | enabled |
|----|-------------|---------|
| 1 | a | 1 |
| 2 | b | 1 |
| 3 | c | 1 |
И еще одна таблица (t_place), как это
| id | description | enabled |
|----|-------------|---------|
| 1 | d | 1 |
| 2 | e | 1 |
| 3 | f | 1 |
Прямо сейчас данные из t_subject
используются для каждой из записей t_place
, чтобы показать выпадающие списки HTML со всеми результатами из t_subject
.
Так что я просто делаю
SELECT * FROM t_subject WHERE enabled = 1
Теперь только для одной из записей t_place
одна запись из t_subject
должна быть скрыта. Я не хочу просто удалять его с помощью javascript, так как я хочу иметь возможность настроить все выпадающие списки, если что-то изменится.
Поэтому первым делом я place_id
столбец t_subject
в t_subject
. Но это означает, что мне нужно продублировать все записи t_subject
, у меня их будет по 3, кроме одной, в которой будет 2.
Есть ли способ избежать этого??
Я подумал добавить столбец id_exclusion
в t_subject
чтобы я мог дублировать записи только тогда, когда запись исключена из другого идентификатора из t_place
.
Насколько это плохо? Таким образом, у меня пока нет дубликатов.
Надеюсь, что все это имеет смысл.
Несмотря на то, что вам нужно исключить только один курс, я все равно рекомендую создать полноценную ассоциацию "место-курс". По сути, у вас есть отношение многие ко многим, несмотря на то, что вы явно не связываете свои таблицы.
Я бы порекомендовал дополнительную таблицу "соединяющая" или " ассоциативная сущность " для представления, какие курсы предлагаются в каких местах. Эта новая таблица будет иметь два столбца - один внешний ключ для идентификатора t_subject
и один для идентификатора t_place
.
Например (t_place_course
):
| place_id | course_id |
|----------|-----------|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 2 | 3 |
| 3 | 1 |
| 3 | 3 |
Как вы можете видеть в моем примере выше, место 3
не предлагает курс 2
.
Отсюда вы можете просто запросить все курсы, доступные для места, place_id
:
SELECT * from t_place_course WHERE place_id = 3
Выше вернутся оба курса 1
и 3
.
При желании вы можете использовать JOIN
чтобы получить другую информацию о курсе или месте, например, описание:
SELECT 't_course'.'description'
FROM 't_course'
INNER JOIN 't_place_course'
ON 't_course'.'id' = 't_place_course'.'course_id'
INNER JOIN 't_place'
ON 't_place'.'id' = 'place_id'
t_place_course_exclude
, и мы могли бы сохранить одну строку (3,2)
. Тогда мы могли бы использовать перекрестное соединение между t_place и t_course с анти-объединением к таблице исключений. например ... FROM t_course c CROSS JOIN t_place p LEFT JOIN t_course_place_exclude x ON x.place_id = p.id AND x.course_id = c.id WHERE x.place_id IS NULL ...
id_location_exclusion
и добавил ограничение внешнего ключа к идентификаторуt_place
колонка