Хороший/плохой дизайн для объединения составного ключа с подчеркиванием в url?
Я ищу лучшие практики в дизайне API RESTful для следующего использования:
Table1 Table2
Id1 Id1
Id2 Id2
Id3 Id3
Name Name
Table1Id1(FK to Table1)
Table1Id1(FK to Table1)
Table1Id1(FK to Table1)
Предположим, что у я есть конечные точки, как показано ниже для таблицы 1:
/root/table1 (to get list of records)
/root/table2 (to get single record by primary key)
Теперь вот мой вопрос: какой будет лучший способ снизу до двух, чтобы представить составной ключ во втором URL:
/root/e1/Id1/Id2/Id3
or
/root/e1?Id1=1&Id2=2&Id3=3
Предположим, что у я есть конечные точки, как показано ниже для таблицы 2:
/root/table1/Table1Id1_Table1Id2_Table1Id1/table2 (to get list of records for table2 by table1).
Теперь вот мой вопрос, который выше url действителен и уместен в случае составного ключа?
Приветствуются любые советы по хорошему шаблону для этого случая использования.
Ответы
Ответ 1
Приветствуются любые советы по хорошему шаблону для этого случая использования.
Не связывайте свои идентификаторы ресурсов с вашей (текущей) схемой базы данных; что нарушает инкапсуляцию.
Я ищу лучшие практики в дизайне API RESTful для следующего использования
ОТДЫХ действительно не волнует. Что касается REST, URI непрозрачен; любая информация, закодированная в нее, выполняется по усмотрению сервера и для собственного использования.
Соответствующими проблемами являются RFC 3986 и ваши локальные соглашения по дизайну.
Компонент пути содержит данные, обычно организованные в иерархической форме, которые наряду с данными в неиерархическом компоненте запроса (раздел 3.4) служат для идентификации ресурса в рамках схемы URI и полномочий именования (если есть).
Элементы пути должны использоваться для иерархических данных - подумайте о том, как разрешают относительные URI.
Основываясь на вашем описании здесь, я бы не подумал, что внешние ключи имеют для них естественную иерархию; конечно, не в общем случае. Поэтому использование неиерархической части URI (запроса) может иметь больше смысла.
Еще одна возможность для рассмотрения - параметры матрицы; вы можете объединить внешние ключи в один сегмент пути, тем самым избегая любого предложения иерархии между ними.
Ответ 2
Согласен с VoiceOfUnreason
Не связывайте свои идентификаторы ресурсов с вашей (текущей) базой данных схемы; что нарушает инкапсуляцию.
Не делайте этого
Для вашего конкретного использования
Как общепринятая практика, REST Urls следует следовать предсказуемой и иерархической схеме для идентификации ресурсов. Это обеспечивает большую прозрачность между клиентом и сервером. Так что предположим, что у вас есть отношения родитель-ребенок в вашем сущности, лучше лучше спроектировать как
/{appname}/{version}/parent/{parentId}/child/{childId}
вместо того, чтобы иметь
/{appname}/{version}/child/{childId}
В вашем случае неиерархическая часть URL-адреса Id1/Id2/Id3
Лучший подход к созданию уникального идентификатора для ваших таблиц. Но если это действительно невозможно, вам лучше пойти на
/root/e1?Id1=1&Id2=2&Id3=3
Это дает представление: "Получите мне e1 с идентификатором" 1 " и Идентификатором" 2 " и Идентификатором" 3 ", который является правильным в вашем контексте
/root/e1/Id1/Id2/Id3
Это нестандартно, поэтому его следует избегать
чтобы получить список записей для таблицы2 по таблице1
У вас должно быть
/root/table1/table2?Table1Id1&Table1Id2&Table1Id1
Ответ 3
Лучшее руководство по дизайну REST API, которое я видел на сегодняшний день, - это Google: https://cloud.google.com/apis/design/
По теме вашего вопроса он содержит эти 3 раздела:
Это действительно хорошее чтение, которое я очень рекомендую.
Отвечая на ваш вопрос на основе руководства Google, я бы сказал: используйте /root/e1/Id1/Id2/Id3
, а не другую версию, которая должна использоваться для создания новых записей.
Но, вероятно, вам не следует подвергать свою схему БД, как рекомендуют другие ответы. Поэтому я упомянул раздел "Ресурсно-ориентированный дизайн" выше. Вероятно, вам нужна какая-то абстракция поверх ваших таблиц. Если ваша операция не является явной операцией над самой схемой БД.