#api #graphql #api-design #graphql-js
#API #graphql #api-дизайн #graphql-js
Вопрос:
Я создаю систему, в которой количество столбцов в таблице не является фиксированным. Я объясню на примере.
Рассмотрим таблицу people с 3 столбцами.
people
----------
id | name | email
Эта таблица будет доступна через GraphQL API, и я смогу запросить таблицу. В моей системе пользователь сможет добавлять пользовательские столбцы в таблицу people. Допустим, они добавляют столбец национальности. Когда они это сделают, национальность не будет доступна в API, потому что она не определена в схеме.
Итак, как я могу сделать свою схему динамической, которая позволяет пользователю запрашивать таблицу people с каждым добавленным дополнительным столбцом?
Ответ №1:
Я могу запросить таблицу information_schema или таблицу fields и получить дополнительные поля для таблицы people, а затем использовать GraphQLObjectType для построения моей схемы вместо использования SDL.
Ответ №2:
это не ответ на ваш вопрос, а предложение, потому что создание динамических столбцов в SQL мне не кажется хорошей идеей. Вместо того, чтобы думать, как вы можете создать динамическую схему, я думаю, вам следует переосмыслить структуру вашей БД.
Вместо добавления новых столбцов в Person
таблицу у вас должна быть другая таблица для ваших пользовательских столбцов, например, создать person_columns
таблицу, подобную
person_columns
----------
id | people_id | column_name | column_value
таким образом, для каждого пользователя у вас может быть несколько столбцов и соответствующих им значений, и вам не нужно беспокоиться о динамическом создании вашей схемы GraphQL. (в зависимости от ваших требований вы можете добавить больше столбцов в person_columns
таблицу для большего контроля)
Комментарии:
1. Я думал об этом решении. Изначально я разработал что-то подобное, но мой столбец был бы внешним ключом в другой таблице, так что мне не нужно повторять column_name. Но это создает некоторые проблемы. Мне пришлось бы выполнить перекрестную таблицу или сводный запрос, чтобы получить нужную мне информацию эффективным способом, что является очень дорогостоящим для БД. Кроме того, мне все равно придется запрашивать таблицу person_columns для построения схемы GraphQL.