Vou lhe dar algum contexto e então fazer minha pergunta. Estou construindo um modelo de banco de dados para um aplicativo de e-commerce. Este aplicativo precisa se comunicar com outro sistema (sistema ERP) para obter produtos, marcas, categorias e outras informações que sejam relevantes para o e-commerce. Atualmente, o modelo de banco de dados de e-commerce é projetado de forma idêntica aos tipos de dados que o sistema externo oferece.
Vou compartilhar com vocês algumas das tabelas de comércio eletrônico:
aikon_artigo
CREATE TABLE `aikon_articulo` (
`aik_ar_codigo` varchar(24) COLLATE utf8mb4_unicode_ci NOT NULL,
`aik_ar_publicarweb` varchar(1) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
`aik_ar_descri` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL,
`aik_ar_memo` varchar(4000) COLLATE utf8mb4_unicode_ci NOT NULL,
`aik_ar_alto` double NOT NULL,
`aik_ar_ancho` double NOT NULL,
`aik_ar_profundo` double NOT NULL,
`aik_ar_color` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
`aik_ar_peso` double NOT NULL,
`aik_ar_descria` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL,
`aik_ar_mesesgarantia` double NOT NULL,
`aik_ar_cosnet` decimal(15,2) NOT NULL,
`aik_ap_utilidad` decimal(6,2) NOT NULL,
`aik_ap_impuesto_interno` decimal(6,2) NOT NULL,
`aik_iva_porcen` decimal(6,2) NOT NULL,
`aik_stock_total` smallint unsigned NOT NULL,
`aik_ap_precio_iva` decimal(15,2) NOT NULL,
`aik_ar_fechamodif` bigint unsigned DEFAULT NULL,
`aik_ar_fecha_alta` bigint unsigned DEFAULT NULL,
`aik_fa_codigo` varchar(20) COLLATE utf8mb4_unicode_ci NOT NULL,
`aik_ma_codigo` varchar(4) COLLATE utf8mb4_unicode_ci NOT NULL,
`aik_re1_codigo` varchar(5) COLLATE utf8mb4_unicode_ci NOT NULL,
`aik_re2_codigo` varchar(5) COLLATE utf8mb4_unicode_ci NOT NULL,
`aik_esa_codigo` varchar(2) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`aik_ar_codigo`),
KEY `aikon_articulo_aik_fa_codigo_fkey` (`aik_fa_codigo`),
KEY `aikon_articulo_aik_ma_codigo_fkey` (`aik_ma_codigo`),
KEY `aikon_articulo_aik_re1_codigo_fkey` (`aik_re1_codigo`),
KEY `aikon_articulo_aik_re2_codigo_fkey` (`aik_re2_codigo`),
KEY `aikon_articulo_aik_esa_codigo_fkey` (`aik_esa_codigo`),
CONSTRAINT `aikon_articulo_aik_esa_codigo_fkey` FOREIGN KEY (`aik_esa_codigo`) REFERENCES `aikon_estado_articulo` (`aik_esa_codigo`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `aikon_articulo_aik_fa_codigo_fkey` FOREIGN KEY (`aik_fa_codigo`) REFERENCES `aikon_familia` (`aik_fa_codigo`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `aikon_articulo_aik_ma_codigo_fkey` FOREIGN KEY (`aik_ma_codigo`) REFERENCES `aikon_marca` (`aik_ma_codigo`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `aikon_articulo_aik_re1_codigo_fkey` FOREIGN KEY (`aik_re1_codigo`) REFERENCES `aikon_referencia01` (`aik_re1_codigo`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `aikon_articulo_aik_re2_codigo_fkey` FOREIGN KEY (`aik_re2_codigo`) REFERENCES `aikon_referencia02` (`aik_re2_codigo`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
aikon_estado_artigo
CREATE TABLE `aikon_estado_articulo` (
`aik_esa_codigo` varchar(2) COLLATE utf8mb4_unicode_ci NOT NULL,
`aik_esa_descri` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`aik_esa_codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
aikon_marca
CREATE TABLE `aikon_marca` (
`aik_ma_codigo` varchar(4) COLLATE utf8mb4_unicode_ci NOT NULL,
`aik_ma_descri` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`aik_ma_codigo`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
Só quero que você preste atenção especial aos tipos de dados que a chave primária tem em cada tabela. Eles são todos strings com comprimentos diferentes. Ou seja, o sistema externo tem padrões nos valores das chaves primárias, dependendo da tabela.
Além disso, ouvi dizer que os melhores tipos de dados para chaves primárias são unsigned bigint
. Estou preocupado se manter tipos de dados de string para cada chave primária é uma boa ideia ou não.
Devo deixar os tipos de dados como estão ou devo alterar os tipos de dados da chave primária para unsigned bigint
?
Na verdade, não sei o quanto esse banco de dados pode crescer, mas não quero ter surpresas no futuro, como não poder INSERT
porque ficamos sem valores de id. Este banco de dados está atualmente em fase de desenvolvimento, então, não há problema em alterar os esquemas.
Se as chaves vêm de um sistema externo sobre o qual você não tem controle, então você não pode depender delas como valores numéricos, certo? Quero dizer, daqui a dois meses, eles podem decidir usar "AA8675309" como formato de id, e então um BIGINT não funcionaria de jeito nenhum.
Você também não pode prever se eles mudarão o comprimento dos valores de id no futuro. Então,
varchar(24)
pode ser muito curto algum dia para os dados que você recebe do sistema ERP.No final das contas, não é possível prever o futuro.
Projete o sistema para lidar com o formato que você sabe que está em uso hoje e defina expectativas com seu empregador de que, se essas suposições mudarem, você terá que fazer alterações para lidar com novos formatos de dados.