diff --git a/core/lib/Drupal/Core/Field/BaseFieldDefinition.php b/core/lib/Drupal/Core/Field/BaseFieldDefinition.php
index e28d9975b492c2260f37888d2276e251c5e23f71..2ff671613ee05f54dc6c4f6082026abbe618aeff 100644
--- a/core/lib/Drupal/Core/Field/BaseFieldDefinition.php
+++ b/core/lib/Drupal/Core/Field/BaseFieldDefinition.php
@@ -12,7 +12,7 @@
 /**
  * A class for defining entity fields.
  */
-class BaseFieldDefinition extends ListDataDefinition implements FieldDefinitionInterface, FieldStorageDefinitionInterface {
+class BaseFieldDefinition extends ListDataDefinition implements FieldDefinitionInterface, FieldStorageDefinitionInterface, RequiredFieldStorageDefinitionInterface {
 
   use UnchangingCacheableDependencyTrait;
 
@@ -723,4 +723,30 @@ public function getConfig($bundle) {
     return BaseFieldOverride::createFromBaseFieldDefinition($this, $bundle);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function isStorageRequired() {
+    if (isset($this->definition['storage_required'])) {
+      return (bool) $this->definition['storage_required'];
+    }
+
+    // Default to the 'required' property of the base field.
+    return $this->isRequired();
+  }
+
+  /**
+   * Sets whether the field storage is required.
+   *
+   * @param bool $required
+   *   Whether the field storage is required.
+   *
+   * @return static
+   *   The object itself for chaining.
+   */
+  public function setStorageRequired($required) {
+    $this->definition['storage_required'] = $required;
+    return $this;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/Field/RequiredFieldStorageDefinitionInterface.php b/core/lib/Drupal/Core/Field/RequiredFieldStorageDefinitionInterface.php
new file mode 100644
index 0000000000000000000000000000000000000000..d29e56907eb98c56232578b70b04abe9697ea870
--- /dev/null
+++ b/core/lib/Drupal/Core/Field/RequiredFieldStorageDefinitionInterface.php
@@ -0,0 +1,21 @@
+<?php
+
+namespace Drupal\Core\Field;
+
+/**
+ * Defines an interface for required field storage definitions.
+ */
+interface RequiredFieldStorageDefinitionInterface {
+
+  /**
+   * Returns whether the field storage is required.
+   *
+   * If a field storage is required, NOT NULL constraints will be added
+   * automatically for the required properties of a field type.
+   *
+   * @return bool
+   *   TRUE if the field storage is required, FALSE otherwise.
+   */
+  public function isStorageRequired();
+
+}
diff --git a/core/tests/Drupal/Tests/Core/Entity/BaseFieldDefinitionTest.php b/core/tests/Drupal/Tests/Core/Entity/BaseFieldDefinitionTest.php
index dbd50e795ef8e563a7e72b358b8369667742fb35..bb4668306b4371b7d4291a0fb8bbae2bde69e1fb 100644
--- a/core/tests/Drupal/Tests/Core/Entity/BaseFieldDefinitionTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/BaseFieldDefinitionTest.php
@@ -254,6 +254,21 @@ public function testFieldRequired() {
     $this->assertFalse($definition->isRequired());
   }
 
+  /**
+   * Tests storage required.
+   *
+   * @covers ::isStorageRequired
+   * @covers ::setStorageRequired
+   */
+  public function testFieldStorageRequired() {
+    $definition = BaseFieldDefinition::create($this->fieldType);
+    $this->assertFalse($definition->isStorageRequired());
+    $definition->setStorageRequired(TRUE);
+    $this->assertTrue($definition->isStorageRequired());
+    $definition->setStorageRequired(FALSE);
+    $this->assertFalse($definition->isStorageRequired());
+  }
+
   /**
    * Tests provider.
    *