MySql добавить отношения без создания обманщиков - PullRequest
0 голосов
/ 07 февраля 2019

Я создал таблицу (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 записи, у меня будет по 3 на каждую, кроме одной, которая будет иметь 2.

Есть ли способ избежать этого ??

Iподумал добавить столбец id_exclusion к t_subject, чтобы я мог дублировать записи только тогда, когда запись исключена из другого идентификатора из t_place.

Насколько это будет плохо ??Таким образом, пока у меня не будет дубликатов.

Надеюсь, все это имеет смысл.

1 Ответ

0 голосов
/ 07 февраля 2019

Несмотря на то, что вам нужно исключить только один курс, я все равно рекомендовал бы создать полную ассоциацию «место-курс».По сути, у вас есть отношение «многие ко многим», несмотря на то, что вы явно не связываете свои таблицы.

Я бы рекомендовал дополнительную таблицу «bridging» или « ассоциативная сущность », чтобы представить, какие курсы предлагаютсяв каких местах.Эта новая таблица будет иметь два столбца - один внешний ключ для идентификатора 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`
...