ดูเหมือนว่าเอนทิตีในที่เก็บข้อมูลใช้คีย์บรรพบุรุษเป็นส่วนหนึ่งของสถานที่ตั้งสิ่งนี้สามารถพึ่งพาได้หรือไม่

Aug 20 2020

นี่คือการตั้งค่าการทดสอบของฉันที่ทำงานในโปรแกรมจำลอง Datastore ด้วยไฟล์ gcloud beta emulators datastore start --no-store-on-disk

การใช้ไคลเอ็นต์ NodeJS การตั้งค่ามีดังนี้ โปรดทราบว่าสำหรับจุดประสงค์ของตัวอย่างฉันใช้การผสมKind + Nameแบบง่ายสำหรับบรรพบุรุษ ฉันทราบดีว่าเอกสารแนวทางปฏิบัติที่ดีที่สุดไม่สนับสนุนชื่อที่กำหนดเองที่สร้างขึ้นซ้ำซากจำเจ

const namespace = 'test';
const datastore = new Datastore();
const entities: any[] = [];
const paths = [
    ['A', '1', 'Z', '1'],
    ['A', '2', 'Z', '1'],
    ['A', '3', 'Z', '1'],
    ['A', '4', 'Z', '1'],
];

for (const path of paths) {
    const key = datastore.key({ path, namespace });
    const data = {
      text: 'Lorem Ipsum',
      path: key.path.toString(),
    };

    entities.push({ key, data });
}

const transaction = datastore.transaction();
await transaction.run();

transaction.upsert(entities);
await transaction.commit();

// wait a second for things to persist.
await new Promise((resolve) => {
    setTimeout(() => resolve(), 1000);
});

// Note that `hasAncestor` is **NOT** provided for this query.
const query = datastore.createQuery(namespace, 'Z');

const results = await datastore.runQuery(query);
expect(results[0]).toHaveLength(1); // fails, got 4 records back

ฉันคาดหวังว่าจะมีเพียง 1 ผลลัพธ์เมื่อค้นหาZเอนทิตีชนิดทั้งหมดหากเส้นทางบรรพบุรุษไม่มีผลต่อตำแหน่งการค้นหาเอนทิตี ไม่ได้เป็นเช่นนั้นในการทดสอบของฉัน แต่ฉันได้รับ 4 ผลลัพธ์กลับมา โปรดสังเกตว่าเส้นทางถูกต้องระหว่างแต่ละเอนทิตีที่ส่งคืนจากแบบสอบถาม:

[
    {
        "path": "A,1,Z,1",
        "text": "Lorem Ipsum"
    },
    {
        "path": "A,2,Z,1",
        "text": "Lorem Ipsum"
    },
    {
        "path": "A,3,Z,1",
        "text": "Lorem Ipsum"
    },
    {
        "path": "A,4,Z,1",
        "text": "Lorem Ipsum"
    }
]

ดังนั้นฉันจึงต้องการยืนยันว่านี่เป็นพฤติกรรมที่ถูกต้องและไม่ใช่แค่สิ่งประดิษฐ์ของอีมูเลเตอร์ หากนี่คือวิธีที่สิ่งต่าง ๆ ควรจะเป็นไปตามนั้นอาจเป็นไปได้ที่จะดูการสร้างอนุกรมเวลาโดยใช้การประทับเวลาแบบยูนิกซ์ตราบเท่าที่ชนิด + ชื่อของบรรพบุรุษให้การป้องกันที่เพียงพอจากการชนกัน ในกรณีนี้ UUID น่าจะเพียงพอตราบเท่าที่กระบวนการร้องขอการเขียนไม่ได้เขียนในระดับที่อาจทำให้เกิดการชนกันของการประทับเวลา ในตัวอย่างนี้สมมติว่าเป็น 1 กระบวนการต่อ UUID ไม่เกิน

['A', '95a69d2f-adac-4da7-b1ab-134ca0e7a840', 'Z', '1000000005000']
['A', '95a69d2f-adac-4da7-b1ab-134ca0e7a840', 'Z', '1000000006000']
['A', '95a69d2f-adac-4da7-b1ab-134ca0e7a840', 'Z', '1000000007000']

หรือนี่ยังเป็นเพียงความคิดที่ไม่ดี?

คำตอบ

JimMorrison Aug 20 2020 at 23:14

นี่คือลักษณะการทำงานที่ถูกต้องที่เอนทิตีถูกคีย์โดยเส้นทางทั้งหมดของคีย์กล่าวคือมีคีย์บรรพบุรุษทั้งหมด

หากคุณมีคำนำหน้า (ต่อกระบวนการ) ที่ไม่ซ้ำกันคุณก็ไม่จำเป็นต้องกังวลเกี่ยวกับคีย์ที่เพิ่มขึ้นซ้ำซากจำเจเนื่องจากการเขียนจะถูกเว้นวรรคในช่องว่างหลักด้วยคำนำหน้า ดังนั้นนี่ควรเป็นโซลูชันที่ปรับขนาดได้