MySql добавить отношения без создания обманщиков

0

Я создал таблицу (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.

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

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

  • 2
    Какая связь между этими двумя таблицами? Я предполагаю, что это база данных для мест, где можно взять предметы? В таком случае, я предполагаю, что это отношение многих ко многим?
  • 0
    Там нет никакого отношения в это время. Я не хотел иметь один, так как для каждого местоположения мне нужны были все предметы ... но теперь я должен исключить один предмет из одного места ... Я добавил столбец id_location_exclusion и добавил ограничение внешнего ключа к идентификатору t_place колонка
Показать ещё 1 комментарий
Теги:
database
duplicates

1 ответ

1
Лучший ответ

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

Я бы порекомендовал дополнительную таблицу "соединяющая" или " ассоциативная сущность " для представления, какие курсы предлагаются в каких местах. Эта новая таблица будет иметь два столбца - один внешний ключ для идентификатора 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'
  • 0
    прохладно. Это действительно хорошая идея. Спасибо!!
  • 1
    Другой альтернативой может быть создание таблицы исключений 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 ...
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню