diff --git a/dynamic_entity_reference.services.yml b/dynamic_entity_reference.services.yml
index 153fff9..7902412 100644
--- a/dynamic_entity_reference.services.yml
+++ b/dynamic_entity_reference.services.yml
@@ -2,3 +2,19 @@ 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', '@entity_field.manager', '@dynamic_entity_reference.storage.create_column']
+    tags:
+      - { name: event_subscriber }
+  dynamic_entity_reference.storage.create_column:
+    class: Drupal\dynamic_entity_reference\Storage\IntColumnHandler
+    tags:
+      - { name: backend_overridable }
+    arguments: ['@database']
+  mysql.dynamic_entity_reference.storage.create_column:
+    class: Drupal\dynamic_entity_reference\Storage\IntColumnHandlerMySQL
+    arguments: ['@database']
+  sqlite.dynamic_entity_reference.storage.create_column:
+    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..9e52b0e
--- /dev/null
+++ b/src/EventSubscriber/FieldStorageSubscriber.php
@@ -0,0 +1,109 @@
+<?php
+
+namespace Drupal\dynamic_entity_reference\EventSubscriber;
+
+use Drupal\Core\Entity\EntityFieldManagerInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Entity\Sql\SqlEntityStorageInterface;
+use Drupal\Core\Entity\Sql\TableMappingInterface;
+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;
+
+  /**
+   * @var \Drupal\Core\Entity\EntityFieldManagerInterface
+   */
+  protected $entityFieldManager;
+
+  /**
+   * EntityType constructor.
+   */
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, EntityFieldManagerInterface $entity_field_manager, IntColumnHandler $int_column_handler) {
+    $this->entityTypeManager = $entity_type_manager;
+    $this->entityFieldManager = $entity_field_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_definition->getType() == 'dynamic_entity_reference' && $storage instanceof SqlEntityStorageInterface) {
+      $field_name = $storage_definition->getName();
+      $storage_definitions = $this->entityFieldManager->getFieldStorageDefinitions($entity_type_id) + [$field_name => $storage_definition];
+      $mapping = $storage->getTableMapping($storage_definitions );
+      $table = $mapping->getFieldTableName($field_name);
+      $columns = $this->getColumns($storage_definitions, $mapping, $table);
+      $column = $columns[$field_name];
+      switch ($event_name) {
+        case FieldStorageDefinitionEvents::CREATE:
+          $this->intColumnHandler->onCreate($table, $columns, $column);
+          break;
+
+        case FieldStorageDefinitionEvents::UPDATE:
+          $original_table = $mapping->getFieldTableName($event->getOriginal()->getName());
+          $original_columns = $this->getColumns($entity_type_id, $mapping, $original_table);
+          $original_column = $original_columns[$field_name];
+          $this->intColumnHandler->onUpdate($table, $columns, $column, $original_table, $original_column);
+          break;
+
+        case FieldStorageDefinitionEvents::DELETE:
+          $this->intColumnHandler->onDelete($table, $column);
+          break;
+      }
+    }
+  }
+
+  /**
+   * @param \Drupal\Core\Field\FieldStorageDefinitionInterface[] $storage_definitions
+   * @param \Drupal\Core\Entity\Sql\TableMappingInterface $mapping
+   * @param string $table
+   * @return array
+   */
+  protected function getColumns($storage_definitions, TableMappingInterface $mapping, $table) {
+    $columns = [];
+    foreach ($storage_definitions as $field_name => $definition) {
+      if ($definition->getType() == 'dynamic_entity_reference' && $mapping->getFieldTableName($field_name) == $table) {
+        $columns[$field_name] = $mapping->getFieldColumnName($definition, 'target_id');
+      }
+    }
+    return $columns;
+  }
+
+}
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..a27381c
--- /dev/null
+++ b/src/Storage/IntColumnHandler.php
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\dynamic_entity_reference\Storage\CreateColumn.
+ */
+
+namespace Drupal\dynamic_entity_reference\Storage;
+
+use Drupal\Core\Database\Connection;
+
+class IntColumnHandler {
+
+  /**
+   * @var \Drupal\Core\Database\Connection
+   */
+  protected $connection;
+
+  public function __construct(Connection $connection) {
+    $this->connection = $connection;
+  }
+
+  public function onCreate($table, array $columns, $column) {
+    throw new \LogicException('Not implemented');
+  }
+
+  public function onUpdate($table, array $columns, $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..00ddb46
--- /dev/null
+++ b/src/Storage/IntColumnHandlerMySQL.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Drupal\dynamic_entity_reference\Storage;
+
+class IntColumnHandlerMySQL extends IntColumnHandler {
+
+  public function onCreate($table, array $columns, $column) {
+    $this->connection->query('LOCK TABLES {' . $table . '} WRITE');
+    $schema = $this->connection->schema();
+    $column_int = $column . '_int';
+    if (!$schema->fieldExists($table, $column_int)) {
+      $schema->addField($table, $column_int, [
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'default' => 0,
+      ]);
+    }
+    $prefixed_name = $this->connection->prefixTables('{' . $table . '}');
+    $this->connection->query("DROP TRIGGER IF EXISTS {$prefixed_name}_update");
+    $this->connection->query("DROP TRIGGER IF EXISTS {$prefixed_name}_insert");
+    $update_trigger = "CREATE TRIGGER {$prefixed_name}_update BEFORE UPDATE ON $prefixed_name FOR EACH ROW SET";
+    $insert_trigger = "CREATE TRIGGER {$prefixed_name}_insert BEFORE INSERT ON $prefixed_name FOR EACH ROW SET";
+    $body = '';
+    $delimiter = '';
+    foreach ($columns as $current_column) {
+      $body .= "$delimiter NEW.{$current_column}_int = CAST(NEW.$current_column AS UNSIGNED)";
+      $delimiter = ',';
+    }
+
+    $this->connection->query("$update_trigger$body");
+    $this->connection->query("$insert_trigger$body");
+    $this->connection->query('UNLOCK TABLES');
+  }
+
+}
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 {
+
+}
