Database
 sql >> Base de Dados >  >> RDS >> Database

Modelo de dados de oficina de automóveis


Administrar uma oficina de automóveis é um negócio realmente complexo. Você precisará marcar compromissos enquanto alguns clientes chegam de carro e você não quer que eles esperem horas. Além disso, você precisará organizar funcionários, rastrear reparos, materiais, cobrar clientes etc. Você definitivamente precisará de uma solução de TI e, claro, um modelo de dados em segundo plano. Hoje vamos falar sobre um desses modelos.

A ideia


Já mencionei que esse modelo de negócio é muito complexo. Portanto, não vou tentar cobrir tudo. Eu omiti intencionalmente materiais de rastreamento e peças de reposição e também simplifiquei algumas partes do modelo. A razão para isso é bem simples. Se eu incluísse realmente tudo, o modelo seria simplesmente grande demais para um artigo de tamanho razoável. Então vamos começar.

Modelo de dados





O modelo é composto por 5 áreas temáticas:
  • Repair shops & employees
  • Customers & contacts
  • Vehicles
  • Services & offers e
  • Visits

Descreveremos cada uma dessas 5 áreas de assunto na ordem em que foram listadas.

Seção 1:oficinas e funcionários


A primeira área de assunto com a qual começaremos é a Repair shops & employees área de estudo. É bastante óbvio que precisamos saber o que temos à disposição antes de podermos fazer ofertas aos clientes.



A city O dicionário é usado para armazenar todas as cidades distintas de onde temos oficinas ou de onde vêm nossos clientes. Cada cidade é definida exclusivamente pelo par postal_codecity_name . Poderíamos decidir ter apenas uma entrada por cidade, mesmo que essa cidade tenha vários códigos postais. Nesse caso, usaríamos apenas o código postal “principal” dessa cidade. Ainda assim, temos a opção de ter várias entradas para a mesma cidade e códigos postais diferentes – caso queiramos.

A repair_shop table é o local onde armazenaremos uma lista de todas as nossas oficinas. Podemos esperar que vamos operar mais de um em algum momento. Cada loja é definida exclusivamente por seu shop_name e o id da cidade a que pertence (city_id ). Também armazenaremos o endereço da loja e details adicionais no formato textual, se houver.

A position dicionário é usado para armazenar position_names exclusivos que poderiam ser atribuídos aos nossos funcionários. Embora a maioria dos cargos esteja relacionada ao nosso negócio principal, também teremos alguns que não fazem parte do negócio principal (funções/cargos técnicos), mas também são essenciais (administração, vendas, etc.).

Uma lista de todos os nossos funcionários é armazenada no employee tabela. Para cada funcionário, armazenaremos seu:

  • first_name &last_name – O nome e o sobrenome do funcionário.
  • employment_start_date &employment_end_date – Data de início e término do funcionário na empresa. A data de término deve conter valor NULL até que possamos defini-lo.
  • position_id – Uma referência à posição atual na empresa.
  • city_id – Uma referência à cidade onde o funcionário mora atualmente.
  • is_active – Um sinalizador indicando se o funcionário está ativo ou não.

A última tabela nesta área de assunto é a schedule tabela. Nesta tabela, armazenaremos os horários exatos de todos os nossos funcionários em um nível diário. Também teremos a opção de armazenar vários intervalos para o mesmo funcionário durante o mesmo dia. Para isso, usaremos os seguintes atributos:
  • repair_shop_id – Uma referência à oficina relacionada.
  • employee_id – Uma referência ao funcionário relacionado.
  • position_id – Uma referência ao cargo relacionado que o funcionário teria durante o período de tempo definido. Na maioria dos casos, esse seria o cargo atual dele, mas temos a flexibilidade de atribuir outro cargo aqui.
  • schedule_date – Uma data à qual esta entrada está relacionada.
  • time_from &time_to – Este par define o período de tempo ao qual esta entrada está relacionada.
  • plan – Um sinalizador indicando se esta foi uma entrada planejada. A entrada não deve ser planejada apenas se a inserirmos ad hoc.
  • actual – Este sinalizador indica se esta entrada foi realizada. Observe que, na maioria dos casos, ambos os sinalizadores, plan e real, seriam definidos como True. Isso indicaria que planejamos e realmente realizamos esse plano.
  • insert_ts – Um carimbo de data/hora indicando o momento em que esse registro foi inserido na tabela.

A combinação repair_shop_id - employee_id - schedule_date - time_from forma a chave UNIQUE/alternativa desta tabela. Antes de inserir um novo registro, devemos também verificar esse novo intervalo time_fromtime_to não se sobrepõe a nenhum intervalo existente para esse mesmo funcionário e data.

Seção 2:clientes e contatos


Agora estamos prontos para passar para a parte do modelo relacionada ao cliente.



Armazenaremos todos os clientes com os quais trabalhamos antes ou com os quais tivemos contato no customer tabela. Para cada cliente, armazenaremos:

  • first_name &last_name – O nome e sobrenome do cliente, caso nosso cliente seja pessoa física.
  • company_name – O nome de uma empresa, em um caso o cliente é uma empresa e não uma pessoa física.
  • address – O endereço do cliente.
  • mobile – O número do celular do cliente.
  • email – O e-mail do cliente
  • details – Todos os detalhes adicionais do cliente, se houver, no formato textual.
  • insert_ts – Um carimbo de data/hora indicando o momento em que esse registro foi inserido na tabela.

A maioria dos atributos nesta tabela são anuláveis ​​porque provavelmente não teremos alguns deles e alguns (first_name &last_name vs. company_name ) exclui outros.

Precisaremos rastrear todos os contatos que fizemos com cada cliente. Para isso, usaremos duas tabelas. Primeiro, o contact_type table, é um dicionário simples contendo apenas o ÚNICO type_name valor.

Os dados de contato real são armazenados no contact tabela. Armazenaremos referências ao tipo desse contato (contact_type_id ), um cliente com quem tivemos contato (customer_id ), um funcionário que fez esse contato (schedule_id ), além de armazenar os dados de contato e a hora em que esse registro foi inserido na tabela (insert_ts ).

Seção 3:Veículos


Depois de conhecer nossos recursos e clientes, precisamos armazenar os veículos com os quais trabalharemos. Além de rastrear dados e criar relatórios internos, na maioria dos países também precisaremos criar relatórios para agências reguladoras, seguradoras, polícia.



Primeiro, vamos definir modelos de nossos veículos. Usaremos 3 tabelas para conseguir isso. No make dicionário, listaremos make_names exclusivos para todos os fabricantes/fabricantes de automóveis/veículos. Além disso, precisaremos conhecer os tipos de veículos, então usaremos mais um dicionário com apenas um atributo de valor único – type_name . O 3 dicionário usado é o model dicionário. Este deve conter a lista de todos os modelos que passaram por nossas portas. Para cada modelo, definiremos a combinação exclusiva model_namemake_idvechicle_type_id .

Terminaremos de descrever esta área de assunto com o vehicle tabela. Esta é a única tabela nesta área de assunto que contém dados “reais”. Usaremos esta tabela para armazenar os seguintes detalhes:

  • vin – Um número de identificação do veículo, definindo exclusivamente este veículo.
  • license_plate – Um número de placa atual.
  • customer_id – Uma referência ao cliente ao qual este veículo pertence. Caso o veículo mude de proprietário, nós o inseriremos como um novo registro, mas saberemos que este é o mesmo veículo com base no número de série.
  • model_id – Uma referência ao dicionário de modelos.
  • manufactured_year &manufactured_month – Indicar o ano e o mês em que este veículo foi produzido.
  • details – Todos os detalhes adicionais no formato textual.
  • insert_ts – Um carimbo de data/hora indicando o momento em que esse registro foi inserido na tabela.

Seção 4:Serviços e ofertas


Estamos prontos para dar o próximo grande passo. Precisamos definir o que oferecemos aos nossos (potenciais) clientes. Podem ser tarefas únicas ou um conjunto de tarefas – serviços.



A lista de todos os serviços é armazenada no service_catalog dicionário. Cada serviço consiste em algumas tarefas e é definido exclusivamente por seu service_name . Além do nome, também armazenaremos uma descrição, se houver, a porcentagem de service_discount e o is_active bandeira. O desconto de serviço deve ser usado para todas as tarefas incluídas neste serviço.

Em seguida, definiremos as tarefas. As tarefas fazem parte dos nossos serviços. Eles são a ação básica que poderia ser feita de forma independente. Cada tarefa é definida por esses valores no task_catalog tabela:

  • task_name &service_catalog_id – Um nome que usaremos para descrever esta tarefa e o serviço ao qual ela pertence. Este par de atributos forma a chave única da tabela.
  • description – A descrição textual adicional, se houver, usada para descrever esta tarefa.
  • ref_interval – Um sinalizador indicando se mediremos o intervalo para esta tarefa.
  • ref_interval_min &ref_interval_max – O limite mínimo e máximo do intervalo de referência.
  • describe – Um sinalizador indicando se devemos adicionar um comentário textual para esta tarefa.
  • task_price – Um preço atual, sem descontos de serviço, para esta tarefa.
  • is_active – Um sinalizador indicando se a tarefa está atualmente ativa (em nossa oferta) ou não.

Após o contato com os clientes, faremos ofertas para eles. A oferta pode ser um serviço completo, com todas as suas tarefas ou um conjunto de tarefas. Todas as ofertas são armazenadas na offer tabela. Para cada oferta, armazenaremos:
  • customer_id – Um ID do cliente relacionado.
  • contact_id – Um id do contato relacionado, se houver. Essas podem ser informações importantes para determinar quantas ofertas surgiram como resultado de contatos anteriores.
  • offer_description – Uma descrição textual adicional desta oferta.
  • service_catalog_id – Um id do serviço que oferecemos ao cliente. Esse id pode ser NULL caso não tenhamos oferecido a ele um serviço completo, mas uma ou mais tarefas que não fazem parte do serviço.
  • service_discount – O desconto de serviço no momento em que a oferta foi criada. Este valor deve conter NULL caso a oferta não esteja relacionada ao serviço.
  • offer_price – Um preço final dessa oferta. Pode ser calculado como a soma de todas as tarefas menos o desconto de serviço.
  • insert_ts – Um carimbo de data/hora indicando o momento em que esse registro foi inserido na tabela.

A última tabela nesta área de assunto é a offer_task tabela. Para cada oferta, não importa se oferecemos um serviço completo ou não, armazenaremos o conjunto de todas as tarefas. Precisamos armazenar os seguintes detalhes:
  • offer_id – Um id da oferta relacionada.
  • task_catalog_id – Um id da tarefa relacionada. Juntamente com o offer_id , ele forma a chave única/alternativa desta tabela
  • task_price – Um preço atual dessa tarefa no momento em que este registro foi inserido.
  • insert_ts - Um carimbo de data/hora indicando o momento em que esse registro foi inserido na tabela.

Seção 5:visitas


A última área de assunto em nosso modelo é usada para armazenar visitas reais de clientes à nossa oficina. Embora pareça complexo, temos apenas 2 novas tabelas aqui, visit e visit_task .



Quando o cliente concordar com nossa oferta ou simplesmente entrar em nossa loja, trataremos isso como uma visit . Para cada um desses eventos, armazenaremos os seguintes detalhes:

  • repair_shop_id – Uma referência à oficina relacionada.
  • customer_id – Uma referência ao cliente ao qual esta visita está relacionada.
  • vehicle_id – Uma referência ao veículo ao qual esta visita está relacionada.
  • visit_start_date – Uma data de início da visita (planejada).
  • visit_start_time – Um horário de início da visita (planejado).
  • visit_end_date – Uma data de início da visita (real). Esse valor deve ser definido quando a visita realmente terminar.
  • visit_end_time – A hora de início da visita (real). Esse valor deve ser definido quando a visita realmente terminar.
  • license_plate – Um número de placa no momento em que a visita aconteceu. Observe que as placas mudam durante o tempo.
  • offer_id – Um id da oferta relacionada, se houver.
  • service_catalog_id – Um id do serviço relacionado, se houver.
  • service_discount – Um valor percentual de desconto no momento em que este registro foi adicionado e caso ofereçamos um serviço completo.
  • visit_price – Um preço total que um cliente deve pagar por essa visita.
  • invoice_created – Um carimbo de data/hora de quando a fatura foi gerada.
  • invoice_due – Um carimbo de data/hora do vencimento da fatura.
  • invoice_charged – Um carimbo de data/hora de quando a fatura foi cobrada.
  • insert_ts – Um carimbo de data/hora indicando o momento em que esse registro foi inserido na tabela.

A última tabela em nosso modelo é a visit_task tabela. Este é o local para armazenar todas as tarefas que realmente fizeram parte dessa visita. Para cada registro aqui, armazenaremos os seguintes valores:
  • visit_id – Uma referência a essa visita.
  • task_catalog_id – Uma referência à tarefa relacionada
  • value_measured – Um valor que foi medido durante esta tarefa, se a tarefa exigir medição.
  • task_description – Uma descrição relacionada a essa tarefa se a tarefa exigir uma descrição.
  • pass – Um sinalizador indicando se esta tarefa estava no intervalo esperado ou não.
  • task_price – Um preço real dessa tarefa no momento inserido nesta tabela.
  • insert_ts – Um carimbo de data/hora que indica o momento em que esse registro foi inserido na tabela.

Embora este modelo seja bastante simplificado, ele contém todos os elementos necessários que você precisará para construir um modelo completo em torno dele. As peças que necessitam de melhorias são definitivamente o material utilizado e o processamento do pagamento. Você acrescentaria algo a mais nesse modelo?