Это в основном вопрос стиля.Когда вы создаете схему, ссылочная целостность - это способ гарантировать качество.Есть и другие способы сделать это - например, модульные тесты, которые гарантируют, что система не примет значения «знака», отличные от 1 и -1.
Итак, где у вас есть таблица, которую вы используете только дляограничьте допустимые записи, если нет никаких дополнительных атрибутов, я бы предложил сделать простейшую вещь и поместить эту логику на уровень приложения с модульными тестами для проверки желаемого поведения.Просто храните данные в базе данных как целое число без внешних ключей.
Если вы действительно хотите, чтобы база данных проверяла записи, вы можете использовать перечисление или сообщить ORM, что столбец является целым числом, но все же создать внешний ключ.Является ли это хорошей идеей, снова зависит от стиля.Я очень предпочитаю "СУХОЙ" - не повторяйся.Если у вас есть логика для ограничения допустимых параметров для атрибута на уровне приложения, сфокусируйтесь на том, чтобы сделать это лучше, не повторяйте эту логику в схеме базы данных.Хотя это не так уж и сложно - если вы думаете, что люди получат доступ к базе данных за пределами вашего приложения, есть законное обоснование наличия внешнего ключа или перечисления.
Я думаю, что ваш time_unit
- это больше, чем набор значений поиска - я предполагаю, что столбец «секунд» используется для преобразования единиц измерения.Здесь есть несколько вариантов, но опять-таки я бы хотел положиться на модульные тесты для проверки моей логики преобразования, и вы могли бы рассмотреть возможность сохранения их как констант в коде приложения, если именно там происходит логика преобразования.Затем вы можете сохранить модуль в виде столбца char в таблице повестки дня.
Это делает вашу логику постоянства проще и быстрее, но возлагает ответственность за проверку поведения на ваши модульные тесты, а не на вашу схему.
Я думаю, что цитата о том, что никогда не следует использовать внешние ключи напрямую, предназначена для того, чтобы предположить, что «нормальным» поведением с использованием вашего ORM было бы обращение к time_unit путем запроса объекта повестки дня (print agendaItem.time_unit.name
), а не явного запросадля внешнего ключа и извлечения связанного объекта (timeUnitID = agendaItem.timeUnitID; print time_unit.findByID(timeUnitID
).Я не думаю, что это общий совет против внешних ключей.