# Marking a message as \`NESTED\`

**URL:** <https://forums.foundationdb.org/t/marking-a-message-as-nested/3322>\
**Category:** Record Layer\
**Created:** [May 16, 2022, 3:58am UTC](https://forums.foundationdb.org/t/marking-a-message-as-nested/3322 "2022-05-16T03:58:20Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![rajivr](https://sea1.discourse-cdn.com/foundationdb/user_avatar/forums.foundationdb.org/rajivr/32/1100_2.png) [@rajivr](https://forums.foundationdb.org/u/rajivr)\
**Post date:** [May 16, 2022, 3:58am UTC](https://forums.foundationdb.org/t/marking-a-message-as-nested/3322/1 "2022-05-16T03:58:20Z")

</div>

When using Record Layer, I was wondering when should a `message` be marked as `NESTED`?

For example in the following definition for a Record Store,

```auto
message MyInnerRecord1 {
    option (com.apple.foundationdb.record.record).usage = NESTED;
    optional int64 val = 1;
}

message MyInnerRecord2 {
    optional int64 val = 1;
}

message MyOuterRecord {
    optional int64 pk = 1 [(com.apple.foundationdb.record.field).primary_key = true];
    optional MyInnerRecord1 my_inner_record1 = 2;
    optional MyInnerRecord2 my_inner_record2 = 3;
}

message UnionDescriptor {
    option (com.apple.foundationdb.record.record).usage = UNION;
    optional MyOuterRecord _MyOuterRecord = 1;
}

```

What would be the difference between using `MyInnerRecord1` and `MyInnerRecord2`?

---

<div class="post-metadata">

**Author:** ![alloc](https://sea1.discourse-cdn.com/foundationdb/user_avatar/forums.foundationdb.org/alloc/32/9_2.png) [@alloc](https://forums.foundationdb.org/u/alloc)\
**Post date:** [May 16, 2022, 11:14pm UTC](https://forums.foundationdb.org/t/marking-a-message-as-nested/3322/2 "2022-05-16T23:14:40Z")

</div>

The `NESTED` usage is essentially optional. What really matters is that any top-level type that you want to be a record type have a corresponding field in the `UNION` message.

I believe we have some validation steps that make sure that messages explicitly marked as `NESTED` don’t wind up in the union message, and messages marked as `MESSAGE` don’t get forgotten. See: [fdb-record-layer/RecordMetaDataBuilder.java at 1aec8f5212a99d1eaeeae9c38a42cc571f42a5a9 · FoundationDB/fdb-record-layer · GitHub](https://github.com/FoundationDB/fdb-record-layer/blob/1aec8f5212a99d1eaeeae9c38a42cc571f42a5a9/fdb-record-layer-core/src/main/java/com/apple/foundationdb/record/RecordMetaDataBuilder.java#L622)

But other than running those validations, setting the message usage as `NESTED` and `RECORD` is optional

---

<div class="post-metadata">

**Author:** ![rajivr](https://sea1.discourse-cdn.com/foundationdb/user_avatar/forums.foundationdb.org/rajivr/32/1100_2.png) [@rajivr](https://forums.foundationdb.org/u/rajivr)\
**Post date:** [May 16, 2022, 11:16pm UTC](https://forums.foundationdb.org/t/marking-a-message-as-nested/3322/3 "2022-05-16T23:16:54Z")

</div>

Thanks @alloc for the reply!
