Estou criando uma API RESTful. Estou lutando para decidir a melhor maneira de projetar minhas tabelas de banco de dados com base em meus recursos.
Inicialmente, pensei que uma tabela por recurso seria um bom caminho, mas agora estou preocupado que isso resulte em tabelas exponencialmente maiores à medida que você avança na cadeia de recursos.
Por exemplo, imagine que eu tenho três recursos - usuários, clientes, vendas. Usuários são assinantes da minha API, clientes são usuários e vendas são compras feitas por cada cliente na conta do usuário.
Um recurso de venda é acessado da seguinte maneira
GET /users/{userID}/clients/{clientID}/sales/{salesID}
Portanto, se houver 10 usuários, cada um com 10 clientes, e para cada cliente houver 10 vendas, o tamanho da tabela aumentará à medida que avançamos na cadeia de recursos.
Estou bastante confiante de que o SQL pode lidar com tabelas grandes, mas não tenho certeza de como a leitura e a gravação irão atrasar as coisas. O exemplo acima talvez não o ilustre, mas minha API terá gravações e leituras progressivamente mais aprofundadas na cadeia de recursos que percorrermos. Portanto, tenho o cenário em que as tabelas maiores do meu banco de dados serão lidas e gravadas mais vezes que as tabelas menores.
Também será necessário ingressar nas tabelas antes de executar as consultas. O motivo é que eu permito que cada usuário tenha um cliente com o mesmo nome. Para evitar a obtenção de dados incorretos do cliente, a tabela de usuários e as tabelas de clientes são unidas por {userID}. Este também é o caso das vendas. A junção de tabelas grandes e a execução de leituras e gravações desaceleram ainda mais?
fonte
Bancos de dados relacionais (portanto, SQL) são realmente bons em localizar uma (ou poucas) linhas de uma tabela enorme. É para isso que servem os índices. Eles também são incríveis no manuseio de junções. Você realmente não tem uma pergunta . Entre as linhas, você está basicamente perguntando sobre como criar um design de banco de dados com vários inquilinos. Sugiro que você leia a Arquitetura de dados com vários locatários antes de fazer mais perguntas. Escolha um dos padrões (banco de dados separado, esquemas separados de banco de dados compartilhado, esquema compartilhado de banco de dados compartilhado) e, em seguida, discutiremos detalhes. No momento, você apenas visualiza o último padrão, mas não considera os prós e os contras. Leia.
Como uma observação lateral: você não precisa
user/{userID}
no URI. Você conhece o inquilino (ID do usuário) nas informações de autenticação.fonte
user_id
como uma chave a todas as tabelas e adicionarleft.user_id = right.user_id
a junções relevantes (geralmente, todas). Alguns ORMs oferecem suporte ao escopo do acesso. E não se engane, seus usuários são inquilinos, pois você não deseja que o usuário 'foo' veja / modifique as vendas da 'barra' do usuário.Apenas para adicionar ao que já foi dito aqui - convém criar uma interface entre a API real e sua camada de banco de dados. Facilita a adição de tabelas de cache e de resumo abaixo da linha ...
fonte