Gå til indhold

What Data 360 Adds to Every Lake Object

Dette indhold er ikke tilgængeligt i dit sprog endnu.

Module 5 in the chapter Streams and the Lake, chapter 6 of the Data 360 Architect course. Each module stands on its own. Previous: When Rows Don’t Make It

The question this module answers: What are the fields on a data lake object that you never sent, and what do they mean for your design?

Open a data lake object after its first load and look at its fields. Your fields are there, the ones from the stream. And beside them are fields you never sent: some starting with KQ_, some called Data Source and Data Source Object, some starting with cdp_sys_. In module 4 we met one thing Data 360 adds, the problem records object with PR in front of its name. These are the others, and they’re not noise. They do two jobs: they keep sources apart, and they trace a record back to where it came from.

One lake object, four groups of fields One data lake object, the airports, with its fields in four groups, left to right: 1. **Yours, the fields you sent:** id__c (the key: OurAirports' permanent id), the ident, the name, the IATA code, and every other column of the file. 2. **Key qualifiers, which keep sources apart:** KQ_id__c, one beside each key, empty until you set a qualifier. An arrow labeled "qualifies" points to the key in the first group. 3. **Lineage, where a row came from:** Data Source, Data Source Object, Internal Organization. 4. **System, not documented:** fields such as cdp_sys_SourceVersion__c. Don't build on these. Footnote: the airport lake object, as this course builds it. Only the first group is yours; Data 360 adds the other three. {"author": "Steve Simpson", "blueprint": "1.1.0", "builder": "standard 1.59.0", "built": "2026-11-12", "id": "DGM-D360-SL-02", "rights": "\u00a9 2026 Twinshark LLC. All rights reserved.", "template": "object-model/logical 1.8.0", "theme": "stevetecharc 1.4.0"} qualifies Yours: the fields you sent id__c (the key: OurAirports' id) ident, name, IATA code, type … every column of the file Key qualifiers: keep sources apart KQ_id__c one beside each key empty until you set one Lineage: where a row came from Data Source Data Source Object Internal Organization System: not documented cdp_sys_SourceVersion__c don't build on these The airport lake object, as this course builds it. Only the first group is yours; Data 360 adds the other three. © 2026 Twinshark LLC · stevetecharc.com
Click to enlarge

Start with the problem. Salesforce’s own example: contacts come in from a CRM org, and subscribers come in from a marketing system. Both are mapped to the Individual data model object, and the marketing system uses the CRM’s contact IDs as its own keys. So the same ID appears on two rows. Join that to the email clicks, and a person who clicked once is counted as having clicked twice, because each copy of the person joins to the same click. A segment for “at least two clicks” picks the wrong people.

And identity resolution doesn’t save you. Salesforce: “This issue occurs even when profile unification is deployed, because engagement data is always joined to the Individual DMO.”

The answer is to say where each key came from. A fully qualified key is “a source key (for example, the identifier-contact ID) and a key qualifier (for example, the source-CRM),” in Trailhead’s words. With one, “the table join uses both the foreign key field (Individual ID) and the key qualifier field (KQ_ID),” and the person is counted once.

That’s what the first group of fields is for. “Data 360 adds key qualifier fields to DLO fields that contain either a primary key or a foreign key. The default value stored in a key qualifier field is null.”

Each one is named KQ_ and then the name of its key. In my own org, the certifications’ lake object from chapter 5 has its record ID, Id__c, as the key, and a KQ_Id beside it (the screenshot below). Which fields count as keys? The primary key, chosen when the stream is created (chapter 3, module 3). And a field becomes a foreign key when it’s mapped to a model field that’s part of a relationship (chapter 8).

The data model objects get them too, and there you don’t touch them: Data 360 adds a key qualifier field to each model object’s primary key and to each field in a relationship, and “You can’t edit these system fields.” The mapping between the lake’s qualifiers and the model’s is done for you; it isn’t on the mapping page.

The fields of the Pilot_Certification_Home lake object: KQ_Id with a key qualifier tick, Record ID (Id__c) as the Primary Key, System Modstamp as the Record Modified Field, Data Source, Data Source Object and SfdcOrganizationId

A key qualifier field, KQ_Id, beside the record ID it qualifies (Salesforce Data 360 in a Developer Edition org, screenshot, November 2026). Full size

The KQ_ fields stay empty until you give them a value. After the stream is created, go to the Data Lake Objects tab and open the lake object. On the key field’s row, open the menu and choose Add Key Qualifier: pick one you already have, or create one with a label, an API name and a description.

The menu on a key field's row in a lake object's Fields list: Add Key Qualifier, View Key Qualifiers, Remove Key Qualifier

Add Key Qualifier, on the key field’s row (Salesforce Data 360 in a Developer Edition org, screenshot, November 2026). Full size

What ends up in the KQ_ field? The API name. In my own org I gave a key a qualifier with the label “PHX Arrivals” and the API name PHX_Arrivals, and after the next full load every row I looked at said PHX_Arrivals. That was on the lake object a batch transform writes (chapter 7, module 4), not a stream’s, but it’s the same kind of field. And it reaches the rows already loaded: when I added a qualifier to the regions’ key, every row already in the lake object showed it in Data Explorer, with no reload. So choose the API name with care: it’s the value every join will compare, and it’s case-sensitive. PHX_Arrivals and PHX_ARRIVALS are different values.

Data Explorer on a lake object: rows such as AA_2026-08-05, each with key_source PHX_ARRIVALS and KQ_airline_date PHX_Arrivals

The key qualifier field holds the API name, PHX_Arrivals (Salesforce Data 360 in a Developer Edition org, screenshot, November 2026). Full size

Two things to plan around:

  • A limit. “You can add up to 20 active key qualifiers. A key qualifier is active when it’s used for a DLO field.” Twenty is plenty for a few sources, and not for one per field. Name them for the source, not the field.
  • Companion orgs. With more than one org (chapter 1, module 3), you add key qualifiers in the home org and wait for them to reach the companions: Salesforce says “wait at least 10 minutes.”

Once qualifiers are in use, a join on the key alone isn’t enough. It can match pilot PLT-000238 from one source to a different PLT-000238 from another (chapter 3, module 3). A join has to use the key and its qualifier.

And it has to work when the qualifier is empty, because two empty values don’t match in SQL. Salesforce’s best practice: “Use COALESCE() on key qualifier fields in all table joins to handle null values and prevent data loss.” COALESCE swaps an empty value for a fixed one, so two empty qualifiers still join.

You’ll see this again wherever joins are written: calculated insights (chapter 10), segments (chapter 11) and the Query API (chapter 14). In my own testing, a segment written in SQL through the API wouldn’t run until its SQL selected the key’s KQ_ field as well as the key. So if you turn on key qualifiers in an org that already has insights and segments, plan to update them. Salesforce: “update your existing calculated insights to add key qualifier fields to table joins and dimensions.”

The second group traces a record back. Data 360 “adds fields to a data object to capture data source details”:

FieldWhat it records
Data SourceThe source of the records, such as one Marketing Cloud Engagement account
Data Source Object“the object where the record came from, such as the name of a cloud storage file”
Internal OrganizationThe business unit that owns the record; “not mapped automatically for CRM sources”

Data Explorer on Pilot_Certification_Home: certification rows such as CRT-000005, each with Data Source Salesforce_Home and Data Source Object starting Pilot_Certification (cut off on screen); the Created By column masked

Lineage from a CRM source: the org connection and the object (Salesforce Data 360 in a Developer Edition org, screenshot, November 2026). Full size

Data Explorer on Pilot_SkyData: pilot rows, each with Data Source UploadedFiles and Data Source Object pilots-synthetic.csv, an empty KQ_pilot_id, and one row with no email

Lineage from a file: the upload and the file’s name (Salesforce Data 360 in a Developer Edition org, screenshot, November 2026). Full size

So when someone finds a strange value and asks where it came from, these fields are the first place to look. They say which source and which object or file. What they may not say is which day’s file, when one stream picks up a new file every day with a wildcard (chapter 4, module 3). I haven’t tested what Data Source Object holds then, each file’s name or the stream’s pattern, so I don’t count on it.

That’s why I still ask whoever makes the files to write the file name, a batch ID and an extract time into every row (chapter 3, module 4). Those I can count on.

The third group starts with cdp_sys_, such as cdp_sys_SourceVersion__c, which is on every lake object in my org. Salesforce calls these system fields, and I haven’t found a page that says what each one holds. So I don’t build on them: no joins, no segments, no rules. If a field isn’t documented, it can change without notice.

None of these replace a good key. A key qualifier keeps two sources apart; it doesn’t make a weak key unique inside one source. And a lineage field says where a record came from; it doesn’t decide which of two versions is newest. Those are still the key you chose and the record modified field (chapter 3, module 3). The added fields sit beside your design. They don’t fix it.

  • Which sources need key qualifiers: any two that can share key values in one model object.
  • The qualifier names, one per source, within the limit of 20.
  • That every join, in insights, segments and queries, uses the key and its qualifier, null-safe; and who updates the old ones when qualifiers are turned on.
  • What the team relies on to trace a record: the lineage fields, and the columns the producer writes. Not undocumented system fields.

All checked 2026-11-14.