2012-05-31 2 views
0

У меня есть стол tablet, с колонкой period_id. Таблица tablet имеет отношение «много-к-одному» с таблицей period, а таблица period имеет отношение «один ко многим» с таблицей sub_period. Мне нужно указать одну запись sub_period в или от tablet, выбор которой ограничен вводом period, но так как sub_period зависит только от period, я не могу. Как мне это моделировать?Как структурировать эти отношения?

В моей модели каждая строка tablet должна содержать одну запись period и одну запись sub_period. Отношение между period и sub_period должно быть 1:n (период может иметь много подпериодов, но каждый подпериод может принадлежать только одному периоду). В sub-period s я хотел бы иметь возможность выбрать из tablet должно быть ограничено моим выбором period

Edit: понял, что мне нужно N: 1 отношения между tablet и period: многие таблетки могут относиться к такой же период.

+0

Вопрос в том, что должно быть таким введением подпериода в таблицу планшета? Functionnaly – Sebas

+0

Как 'sub_period' записывает свою связь с' period'? Конечно, у него также есть столбец 'period_id'? В этом случае вы не можете просто [присоединиться] (http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html) 'tablet' непосредственно к' sub_period 'в этой колонке? – eggyal

+0

@sebas Это будет один из подмножеств записей с sub_period, в зависимости от того, какой период был выбран. Предположим, что существует два периода: A и B. период A имеет sub_periods sp_A_1 и sp_A_2, период B имеет sub_periods sp_A_3 и sp_A_4.Если моя запись в таблетке связывается с периодом A, я должен тогда выбирать только между sp_A_1 и sp_A_2. – urschrei

ответ

0

Тогда у вас есть 2 варианта: слой

  • базы данных: Реализовать непротиворечивости контрсилами через триггеры. после вставки или обновления, если sub_pediod не является sub_period периода таблеток, поднимите соответствующую ошибку.
  • Применительный уровень: реализуйте правильный графический интерфейс, чтобы обеспечить правильный выбор, когда это необходимо.

Второй вариант - мой любимый, когда речь заходит о нечувствительных данных (имейте в виду, что кто-то всегда может пропустить клиентский интерфейс), потому что он обычно дает мне больше «диапазона движения» с тем, как я хочу иметь дело с проблема. Конечно, всегда есть исключения ...

0

Когда вы моделируете вас, обычно вы не создаете отношения 1: 1, когда вы нормализуетесь, вы заметите, что таблица с соотношением 1: 1 вы можете сопоставить их с таблицей, вот как я вижу это: , если у вас есть 3 таблицы с отношениями

  • таблетка 1: N sub_period
  • таблетки 1: 1 период

(ключи в графике ключи праймериз и красный символ является внешним ключом)

enter image description here

или вы можете сделать матч между Tablet и Периодом таблицей и модель будет выглядеть следующим образом

enter image description here

где Tablet absorb Период со всеми его атрибутами, но это зависит от вас, модель, которую вы должны адаптировать к вашим потребностям.

2

Создать нулевую колонку has_tablet ENUM('1') в sub_period и создать ограничение UNIQUE на sub_period (period, has_tablet).

has_tablet может принимать только значения 1 или NULL, что означает, что вы можете установить ровно один сезон за период как «имеющий планшет». Поскольку period до tablet является взаимно однозначным, это однозначно идентифицирует tablet.

Возможно, не устанавливать какую-либо таблетку в течение определенного периода времени с помощью этого решения. Если это проблема, добавьте period в tablet и сделайте tablet (period, sub_period) справка sub_period (period, sub_period).

Это денормализация, но она никогда не может привести к несогласованности (поскольку period определяется как sub_period в обеих таблицах).

Обновление:

Кажется, что период, в таблетке один-ко-многим. В этом случае просто добавьте make tablet ссылка sub_period, а не period. period отношения могут быть транзитивно выведены простым соединением.

+0

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

+0

@urschrei: Но ... вы сказали, что это отношения 1 к 1 между 'tablet' и' period'. Если бы многие планшеты ссылались на один и тот же подпериод, они также должны были ссылаться на тот же период, что противоречило бы отношениям 1/1 таблетка/период. Что мне не хватает? –

+0

@AndriyM Вот где я смущаюсь. Каждая строка может иметь только одну запись периода и одну запись в подпериоде. Но это решение подразумевает, что если привязать запись планшета к подпериоду один раз, я не смогу связать какие-либо другие планшеты с этим подпериодом. Если я не ошибаюсь. – urschrei

Смежные вопросы