Как лучше всего отформатировать данные JSON, используемые SPA? - PullRequest
0 голосов
/ 14 января 2019

Я работаю с другом над одностраничным приложением (в React, но я считаю, что фреймворк на самом деле не имеет значения, тот же вопрос относится и к Angular).

Есть база данных с 2 таблицами:

  • Функция
  • Car

Обе таблицы связаны в базе данных с отношением «многие ко многим».

Мы различаемся в том, как мы должны передавать данные из бэкэнда во внешний интерфейс (точнее, CarManagementComponent, который позволит пользователю работать с машинами / функциями (редактировать / обновлять / удалять и т. Д.)). Мы хотим иметь возможность выполнить несколько действий перед тем, как отправлять запрос обратно на сервер, чтобы обновить базу данных, чтобы пользователь имел интерфейс, похожий на настольное приложение.

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

1) Мой подход:

{
    "Features": [
        {
            "Id": 0,
            "Price": 3000,
            "Name": "led lights",
            "Color": "transparent",
            "Brand": "Valeo",
            "Guarantee": 12
        },
        {
            "Id": 1,
            "Price": 1000,
            "Name": "air conditioning",
            "Color": "",
            "Brand": "Bosch",
            "Guarantee": 12
        },
        {
            "Id": 2,
            "Price": 600,
            "Name": "tinted windows",
            "Color": "",
            "Brand": "Bosch",
            "Guarantee": 36
        }
    ],
    "Cars": [
        {
            "Id": 0,
            "Name": "Ford Mustang GT",
            "Weight": 2210,
            "Features":[
                {
                    "Id": 0, // id of many-to-many relations record
                    "FeatureId": 2
                },
                {
                    "Id": 1, // id of many-to-many relations record
                    "FeatureId": 1
                }
            ]
        },
        {
            "Id": 1,
            "Name": "Volkswagen Arteon",
            "Weight": 1650,
            "Features":[
                {
                    "Id": 2, // id of many-to-many relations record
                    "FeatureId": 2
                }
            ]
        }         
    ]
}

2) Подход моего друга:

{
    "Cars": [
        {
            "Id": 0,
            "Name": "Ford Mustang GT",
            "Weight": 2210,
            "Features": [
                {
                    "Id": 1,
                    "Price": 1000,
                    "Name": "air conditioning",
                    "Color": "",
                    "Brand": "Bosch",
                    "Guarantee": 12
                },
                {
                    "Id": 2,
                    "Price": 600,
                    "Name": "tinted windows",
                    "Color": "",
                    "Brand": "Bosch",
                    "Guarantee": 36
                }
            ]
        },
        {
            "Id": 1,
            "Name": "Volkswagen Arteon",
            "Weight": 1650,
            "Features": [
                {
                    "Id": 2,
                    "Price": 600,
                    "Name": "tinted windows",
                    "Color": "",
                    "Brand": "Bosch",
                    "Guarantee": 36
                }
            ]
        }
    ]
}

Я считаю, что 1-й подход лучше, потому что:

  • весит меньше (без избыточности данных)
  • было бы проще преобразовать такие данные в объектно-ориентированную структуру
  • например. мы можем видеть все записи Feature (при втором подходе мы увидим только те записи, которые связаны с Cars, и потребуется еще один внутренний запрос)
  • например. в отличие от второго подхода, мы можем получить все необходимые данные всего за 1 запрос (меньше проблем с синхронизацией), и мы можем сохранить измененные данные в одном запросе

Мой друг говорит, что второй подход лучше, потому что:

  • было бы проще добиться этого с помощью ORM (спящий режим)
  • он никогда не видел 1-й подход в своей жизни (который может привести к выводу, что это делается неправильно)

Что ты думаешь? Какое решение лучше? Может быть, они оба в некоторых областях? Может быть, есть третье решение, о котором мы еще не думали?

1 Ответ

0 голосов
/ 14 января 2019

Я бы сказал, что мне больше всего нравится ваш подход по двум основным причинам:

  1. Принимая во внимание, что дублирование данных плохо в HTTP-запросе, ваш подход избегает его.
  2. Вы пропускаете FeatureId внутри автомобильного объекта, и этого достаточно, чтобы эта функция работала эффективно (O).

Чтобы сделать его еще лучше, вы можете изменить структуру объектов следующим образом:

"Features": {
       0: { // <- If the id is unique, you can use it as a key.
            "Id": 0,
            "Price": 3000,
            "Name": "led lights",
            "Color": "transparent",
            "Brand": "Valeo",
            "Guarantee": 12
        },
        1: {
            "Id": 1,
            "Price": 1000,
            "Name": "air conditioning",
            "Color": "",
            "Brand": "Bosch",
            "Guarantee": 12
        },
        2: {
            "Id": 2,
            "Price": 600,
            "Name": "tinted windows",
            "Color": "",
            "Brand": "Bosch",
            "Guarantee": 36
        }
    },

Таким образом, вы можете получить функцию в O (1).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...