Ao fazer o design de banco de dados, costumo usar tabelas de referência/suporte, como todos nós fazemos. Cada vez que inicio um novo projeto há inevitavelmente tabelas que:
- Tenha um conjunto predefinido de valores.
- Nunca mudará e provavelmente nunca encontrará novos registros (ou muito raramente).
Um exemplo perfeito disso pode ser uma Country
tabela.
create table Country
(
CountryKey int not null identity
,CountryName varchar(64) not null
,IsoNumber int not null
,Iso3 varchar(8) not null
,constraint pk_country primary key clustered (CountryKey)
);
Eu usei várias abordagens diferentes para "hidratar" esses tipos de tabelas, principalmente:
- Um script SQL de hidratação com instruções de inserção.
insert into Country (CountryName, IsoNumber ...) values ('Canada', ...)
Um script SQL de hidratação, lendo do disco, usando
bulk insert
.bulk insert MyDatabase.dbo.Country from ...
E em casos extremos um script programático (f#, python).
Minha abordagem preferida é a primeira se todas as tabelas contiverem apenas alguns registros. Se as tabelas estiverem além desse limite, normalmente gosto de um script lendo arquivos CSV. Eu escolho usar CSV por ser compacto e legível por humanos.
Como todos os outros estão lidando com essa situação?
Eu percebo que esta é uma questão um tanto opinativa. Mas achei que valia a pena perguntar, pois inevitavelmente terá respostas concretas com fundamentação técnica.
Arquivos separados
Mantenha
CREATE TABLE
,INSERT
,GRANT
scripts separadamente. Os dados PODEM mudar "por projeto" (por exemplo, 'Oui' vs 'YES'). Além disso, este parece ser um design comum para a maioria dos projetos que eu vi/trabalhei.INSERIR vs Outros
As operações em massa (f#,python,CSV) são mais rápidas do que várias
INSERT
instruções de linha única.Eu definitivamente usaria
INSERT
para algumas linhas. O "ponto de corte" entreINSERT
o Código/CSV seria uma decisão pessoal.Uso do código
Eu só consideraria usar código (f#,python) se e somente se os dados fossem calculados com base nos parâmetros de entrada. (por exemplo, uma
DAY_DIMENSION
tabela que carrega n dias de cada vez)Scripts CSV
Para dados consideráveis, você deseja usar um script CSV para velocidade
O script que carrega o arquivo CSV (ou outro formato) deve usar o nome do arquivo como parâmetro. Todos os utilitários (por exemplo, SQL*Loader) fazem isso; você só precisa filtrar o parâmetro até o nível do Shell Script. Isso permite que você carregue um arquivo diferente (específico do projeto/revisão atualizada) à vontade.
Certifique-se de anotar se globbing (por exemplo
LoadMyData.sh data_0[1-3]*.csv
, ) é permitido.Lixões
Uma das maneiras mais fáceis de portar tabelas é usar Dumps (como Dave sugeriu). (por exemplo, do Oracle
expdp
/impdp
)Você ainda deve ter as instruções DDL disponíveis para poder recriar as tabelas (e fazer dump) conforme necessário.