Это хорошая идея использовать ha sh (sha1) в качестве идентификатора для документа firestore? - PullRequest
0 голосов
/ 28 мая 2020

Мой сценарий выглядит следующим образом:

  1. Я использую api новостей BING, и возврат из api представляет собой список следующих объектов:

    {
        "name": "Eterna Resenha contará com as participações de Neto e Vampeta",
        "url": "https://www.terra.com.br/esportes/lance/eterna-resenha-contara-com-as-participacoes-de-neto-e-vampeta,82e493e511734febfcdfda6fbd22c105xjafr9k2.html",
        "image": {
            "contentUrl": "http://p2.trrsf.com/image/fget/cf/800/450/middle/images.terra.com/2020/05/27/5ece8e302d1fb.jpeg",
            "thumbnail": {
                "contentUrl": "https://www.bing.com/th?id=ON.4E1CF6986982B70A3D6009F435822EF2&pid=News",
                "width": 700,
                "height": 393
            }
        },
        "description": "Durante a quarentena, as lives tomaram conta do país, tentando arrecadar doações para ajudar quem sofre com o coronavírus...",
        "provider": [
            {
                "_type": "Organization",
                "name": "Terra"
            }
        ],
        "datePublished": "2020-05-28T00:00:00.0000000Z",
        "category": "Entertainment"
    }
    
  2. Обратите внимание, что в этом объекте нет поля id, поэтому я импровизировал идентификатор, изменив поле datePublished на Date и использовал метод getTime чтобы вернуть длинный, а затем объединить с языком новостей следующим образом:

    const time = new Date(news.datePublished).getTime()
    const id = `${language}${time}`
    
    await database.collection(`news`).doc(`${id}`).set(news, { merge: true })
    
  3. Это решение становится неэффективным, когда те же новости возвращаются из API BING с обновленной датой, что вызывает объект для дублирования в моей базе данных firestore.

Решение, которое я планирую использовать

Преобразуйте URL-адрес новости в hash с помощью Алгоритм sha1 выглядит следующим образом:

const CryptoJS = require("crypto-js");
const id = `${CryptoJS.SHA1(news.url)}`

await database.collection(`news`).doc(`${id}`).set(news, { merge: true })

Руководство передовые методы создания документов firestore оставляет возможности для использования идентификаторов в этом формате. Но меня больше всего беспокоит производительность с большим идентификатором (d40e5b8df6462e138fe617a84ddabae7f78360a6), поскольку у меня будут тысячи новостей как минимум на 5 языках.

Помните: Мне нужно создать отслеживаемые идентификаторы (на основе некоторое свойство объекта), потому что некоторые новости могут быть получены из новостей BING с тем же содержанием и с другим datePublished, тогда мне нужно будет обновить их.

Я хотел бы знать, есть ли какие-либо контр-точки, которые делают выбрать другое решение?

1 Ответ

0 голосов
/ 28 мая 2020

Вы можете использовать функцию генератора идентификаторов Firestore по умолчанию. Я почти уверен, что «большой идентификатор» не вызовет заметных проблем с производительностью, поэтому Google использует такую ​​функцию для генерации уникальных идентификаторов в своих базах данных.

Вот функция, которую я извлек и использовал для моих проектов в течение длительного времени:

        const generateId = function () {
        // Alphanumeric characters
        const chars =
            'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
        let autoId = '';
        for (let i = 0; i < 20; i++) {
            autoId += chars.charAt(Math.floor(Math.random() * chars.length));
        }
        return autoId;
    };

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

...