Database tables created that are not from entity definitions

If you browse around the DB tables in your drupal site, you might stumble into tables with double underscore names like commerce_order__shipments, this is most probably a table created as part of drupal field API system, mostly created as a multivalue field for some entity. It could be created when user creates field in UI or it could be programmatically made, like here

  $configurable_field_manager = \Drupal::service('commerce.configurable_field_manager');
  $field_definition = commerce_shipping_build_shipment_field_definition($order_type->id());
  if (!$previous_value && $settings['enable_shipping']) {
    $configurable_field_manager->createField($field_definition);
  }

which is part of commerce_shipping_order_type_form_submit form, so when user submits a new order type, this is hooked to that form to create new field that stores data about shipments. The sole field definition is here in

function commerce_shipping_build_shipment_field_definition($order_type_id) {
  $field_definition = BundleFieldDefinition::create('entity_reference')
    ->setTargetEntityTypeId('commerce_order')
    ->setTargetBundle($order_type_id)
    ->setName('shipments')
    ->setLabel('Shipments')
    ->setCardinality(BundleFieldDefinition::CARDINALITY_UNLIMITED)
    ->setSetting('target_type', 'commerce_shipment')
    ->setSetting('handler', 'default');

  return $field_definition;
}

and the name of the new field is derived from setTargetEntityTypeId and setName. And this is how this new DB table came to life.