diff --git a/dynamic_entity_reference.services.yml b/dynamic_entity_reference.services.yml
index 153fff9..f2dbe28 100644
--- a/dynamic_entity_reference.services.yml
+++ b/dynamic_entity_reference.services.yml
@@ -2,3 +2,16 @@ services:
   plugin.manager.dynamic_entity_reference_selection:
     class: Drupal\dynamic_entity_reference\SelectionPluginManager
     parent: plugin.manager.entity_reference_selection
+  dynamic_entity_reference.entity_type_subscriber:
+    class: Drupal\dynamic_entity_reference\EventSubscriber\FieldStorageSubscriber
+    arguments: ['@entity_type.manager', '@dynamic_entity_reference.storage.create_column']
+  dynamic_entity_reference.storage.create_column:
+    class: Drupal\dynamic_entity_reference\Storage\IntColumnHandler
+    tags:
+      - { name: backend_overridable }
+  dynamic_entity_reference.storage.create_column.mysql:
+    class: Drupal\dynamic_entity_reference\Storage\IntColumnHandlerMySQL
+    arguments: ['@database']
+  dynamic_entity_reference.storage.create_column.sqlite:
+    class: Drupal\dynamic_entity_reference\Storage\IntColumnHandlerSqlite
+    arguments: ['@database']
diff --git a/dynamic_entity_reference.views.inc b/dynamic_entity_reference.views.inc
index 7ba1b27..e88ec31 100644
--- a/dynamic_entity_reference.views.inc
+++ b/dynamic_entity_reference.views.inc
@@ -50,7 +50,7 @@ function dynamic_entity_reference_field_views_data(FieldStorageConfigInterface $
         'base' => $target_base_table,
         'entity type' => $target_entity_type_id,
         'base field' => $target_entity_type->getKey('id'),
-        'relationship field' => $field_name . '_target_id',
+        'relationship field' => $field_name . '_target_id_int',
         // Entity reference field only has one target type whereas dynamic
         // entity reference field can have multiple target types that is why we
         // need extra join condition on target types.
@@ -80,7 +80,7 @@ function dynamic_entity_reference_field_views_data(FieldStorageConfigInterface $
         'base field' => $entity_type->getKey('id'),
         'field_name' => $field_name,
         'field table' => $table_mapping->getDedicatedDataTableName($field_storage),
-        'field field' => $field_name . '_target_id',
+        'field field' => $field_name . '_target_id_int',
         // Entity reference field only has one target type whereas dynamic
         // entity reference field can have multiple target types that is why we
         // need extra join condition on target types.
@@ -146,7 +146,7 @@ function dynamic_entity_reference_views_data() {
     foreach ($fields as $field) {
       $field_name = $field->getName();
       $columns = $table_mapping->getColumnNames($field_name);
-      $column_id = $columns['target_id'];
+      $column_id = $columns['target_id'] . '_int';
       $column_type = $columns['target_type'];
 
       // Unlimited (-1) or > 1 store field data in a dedicated table.
diff --git a/src/EventSubscriber/FieldStorageSubscriber.php b/src/EventSubscriber/FieldStorageSubscriber.php
new file mode 100644
index 0000000..d1a5524
--- /dev/null
+++ b/src/EventSubscriber/FieldStorageSubscriber.php
@@ -0,0 +1,81 @@
+<?php
+
+namespace Drupal\dynamic_entity_reference\EventSubscriber;
+
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Entity\Sql\SqlEntityStorageInterface;
+use Drupal\Core\Field\FieldStorageDefinitionEvent;
+use Drupal\Core\Field\FieldStorageDefinitionEvents;
+use Drupal\dynamic_entity_reference\Storage\IntColumnHandler;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Hands off field storage events to the integer column handler.
+ */
+class FieldStorageSubscriber implements EventSubscriberInterface {
+
+  /**
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * @var \Drupal\dynamic_entity_reference\Storage\IntColumnHandler
+   */
+  protected $intColumnHandler;
+
+  /**
+   * EntityType constructor.
+   */
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, IntColumnHandler $int_column_handler) {
+    $this->entityTypeManager = $entity_type_manager;
+    $this->intColumnHandler = $int_column_handler;
+  }
+
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    $event = array('onFieldStorageDefinitionEvent', 100);
+    $events[FieldStorageDefinitionEvents::CREATE][] = $event;
+    $events[FieldStorageDefinitionEvents::UPDATE][] = $event;
+    $events[FieldStorageDefinitionEvents::DELETE][] = $event;
+    return $events;
+  }
+
+  /**
+   * Listener method for any field storage definition event.
+   *
+   * @param \Drupal\Core\Field\FieldStorageDefinitionEvent $event
+   *   The field storage definition event object.
+   * @param string $event_name
+   *   The event name.
+   */
+  public function onFieldStorageDefinitionEvent(FieldStorageDefinitionEvent $event, $event_name) {
+    $storage_definition = $event->getFieldStorageDefinition();
+    $entity_type_id = $storage_definition->getTargetEntityTypeId();
+    $storage = $this->entityTypeManager->getStorage($entity_type_id);
+    if ($storage instanceof SqlEntityStorageInterface) {
+      $mapping = $storage->getTableMapping();
+      $column = $mapping->getFieldColumnName($storage_definition, 'target_id');
+      $table = $mapping->getFieldTableName($storage_definition->getName());
+      switch ($event_name) {
+        case FieldStorageDefinitionEvents::CREATE:
+          $this->intColumnHandler->onCreate($table, $column);
+          break;
+
+        case FieldStorageDefinitionEvents::UPDATE:
+          $original_column = $mapping->getFieldColumnName($event->getOriginal(), 'target_id');
+          $original_table = $mapping->getFieldTableName($event->getOriginal()->getName());
+          $this->intColumnHandler->onUpdate($table, $column, $original_table, $original_column);
+          break;
+
+        case FieldStorageDefinitionEvents::DELETE:
+          $this->intColumnHandler->onDelete($table, $column);
+          break;
+      }
+    }
+  }
+
+}
diff --git a/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php b/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php
index 54a153f..9835250 100644
--- a/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php
+++ b/src/Plugin/Field/FieldType/DynamicEntityReferenceItem.php
@@ -73,7 +73,7 @@ class DynamicEntityReferenceItem extends EntityReferenceItem {
    * {@inheritdoc}
    */
   public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
-    $properties['target_id'] = DataReferenceTargetDefinition::create('integer')
+    $properties['target_id'] = DataReferenceTargetDefinition::create('string')
       ->setLabel(t('Entity ID'))
       ->setSetting('unsigned', TRUE)
       ->setRequired(TRUE);
diff --git a/src/Storage/IntColumnHandler.php b/src/Storage/IntColumnHandler.php
new file mode 100644
index 0000000..3fc0e25
--- /dev/null
+++ b/src/Storage/IntColumnHandler.php
@@ -0,0 +1,23 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\dynamic_entity_reference\Storage\CreateColumn.
+ */
+
+namespace Drupal\dynamic_entity_reference\Storage;
+
+class IntColumnHandler {
+
+  public function onCreate($table, $column) {
+
+  }
+
+  public function onUpdate($table, $column, $original_table, $original_column) {
+
+  }
+
+  public function onDelete($table, $column) {
+
+  }
+}
diff --git a/src/Storage/IntColumnHandlerMySQL.php b/src/Storage/IntColumnHandlerMySQL.php
new file mode 100644
index 0000000..983ff7e
--- /dev/null
+++ b/src/Storage/IntColumnHandlerMySQL.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace Drupal\dynamic_entity_reference\Storage;
+
+class IntColumnHandlerMySQL extends IntColumnHandler {
+
+}
diff --git a/src/Storage/IntColumnHandlerSQLite.php b/src/Storage/IntColumnHandlerSQLite.php
new file mode 100644
index 0000000..bd834be
--- /dev/null
+++ b/src/Storage/IntColumnHandlerSQLite.php
@@ -0,0 +1,8 @@
+<?php
+
+namespace Drupal\dynamic_entity_reference\Storage;
+
+
+class IntColumnHandlerSQLite extends IntColumnHandler {
+
+}
