Estrutura SQL, Transações ACID, Performance e Segurança com Dapper.
O Optimizer decide o plano de execução. A engine (executor) apenas executa o plano escolhido.
O optimizer testa caminhos possíveis e escolhe o plano com menor custo estimado. A engine só executa.
Estruturas (B-Tree, Hash) que aceleram a busca, mas custam na escrita.
Como o banco decide executar a query (Table Scan vs Index Seek).
Simplificam queries complexas e controle de acesso.
Executam lógica automática em eventos (INSERT/UPDATE).
COMMIT, os dados permanecem mesmo com queda de energia
ou crash.Em bancos tradicionais, ACID é o que garante confiança em operações críticas (pagamentos, estoque, transferência).
Um "Micro-ORM" (Object-Relational Mapper) leve para .NET.
Acesse o código-fonte: github.com/afonsolelis/aula_dotnet_cars
Concatenar strings diretamente na query permite que atacantes executem comandos maliciosos.
O banco trata o input como dado literal, nunca como comando executável.
@Name) e os dados separadamente para o banco.'; DROP TABLE..., isso será buscado como um nome de usuário
bizarro, e não executado.Modelagem Corporativa não é sobre criar tabelas; é sobre mapear os ativos de informação da empresa.
Focar direto no físico e criar "silos de dados" que não conversam entre áreas.
A tentativa de criar um único modelo canônico global geralmente falha.
O conceito de "Produto" muda de contexto:
Não force uma unificação prematura. Modele contextos explícitos.
Resumo: DDD alinha produto, times e dados — e diminui “traduções” erradas entre áreas.
Responsável pelo significado e qualidade do dado em um domínio.
Glossário vivo. "O que significa 'Churn' para o Marketing?"
Rastreabilidade. De onde veio esse dado e quem o consome?
Governança moderna não é bloqueio, é enabler para Self-Service Analytics.
Descentralização total.
Modelagem para Data Warehouses ágeis.
Churn: percentual de clientes que deixam de usar o produto em um período (ex: mês). É um dos indicadores mais críticos para o negócio.
Conjunto de entidades tratadas como uma unidade de consistência.
NoSQL não é “anti-relacional”. É pró-fluxo de negócio e pró-escala.
Evite quebrar o pedido em 6 tabelas e depender de joins em tempo real.
Benefício: atendimento responde em uma leitura, sem depender de múltiplos serviços.
Resultado: velocidade de entrega com governança mínima viável.
NoSQL não precisa ser "modelagem no improviso". Podemos trazer a disciplina do mundo relacional para o NoSQL usando agregados.
Essa árvore vira um contrato estrutural que melhora manutenção, integração e qualidade dos dados.
O MongoDB materializa o contrato com o validador nativo $jsonSchema, aplicado na
criação/modificação de coleções.
db.createCollection("author", {
validator: {
$jsonSchema: {
bsonType: "object",
required: ["_id", "name", "address"],
properties: {
_id: { bsonType: "objectId" },
name: { bsonType: "string" },
email: { bsonType: "string" },
address: {
bsonType: "object",
required: ["street"],
properties: {
street: { bsonType: "string" },
number: { bsonType: "string" },
zip: { bsonType: "string" }
}
},
books: {
bsonType: "array",
items: { bsonType: "objectId" }
}
}
}
},
validationAction: "error",
validationLevel: "moderate"
});
bsonType — tipagem (string, objectId, array, object...)required — campos obrigatóriosproperties — objetos aninhadosoneOf — disjunções (composição lógica)insert/update precisa satisfazer o schemavalidationAction: error (rejeita) ou warn (loga)validationLevel: strict ou moderate| Cardinalidade | bsonType | required? | Extras |
|---|---|---|---|
| 0–1 | "object" ou tipo simples |
Nao | Campo opcional |
| 1–1 | "object" ou tipo simples |
Sim | Entra em required |
| 0–N | "array" + items |
Nao | Sem minItems |
| 1–N | "array" + items |
Sim | minItems: 1 |
objectId isoladoobjectIdobjectId, normalmente
required{
bsonType: "object",
required: ["_id", "name", "address"],
properties: {
_id: { bsonType: "objectId" },
name: { bsonType: "string" },
address: {
bsonType: "object", // 1-1
required: ["street"],
properties: {
street: { bsonType: "string" },
number: { bsonType: "string" },
zip: { bsonType: "string" }
}
},
books: {
bsonType: "array", // 0-N
items: { bsonType: "objectId" }
}
}
}
O mesmo conceito se aplica em aplicações C# com o driver oficial MongoDB.Driver:
public class Author // Aggregate Root
{
[BsonId]
public ObjectId Id { get; set; }
[BsonElement("name")]
public string Name { get; set; } = "";
[BsonElement("email")]
public string? Email { get; set; } // 0-1
[BsonElement("address")]
public Address Address { get; set; } // 1-1
= new();
[BsonElement("books")]
public List<ObjectId> Books { get; set; }
= new(); // 0-N
}
public class Address // Entidade local
{
[BsonElement("street")]
public string Street { get; set; } = "";
[BsonElement("number")]
public string? Number { get; set; }
[BsonElement("zip")]
public string? Zip { get; set; }
}
| C# | MongoDB |
|---|---|
string Name |
required + string |
string? Email |
opcional (0–1) |
Address Address |
required + object (1–1) |
List<ObjectId> |
array (0–N) |
A aplicação modela com classes; o schema valida no banco; o driver garante persistência consistente.
var client = new MongoClient("mongodb://localhost:27017");
var db = client.GetDatabase("meuApp");
// Define o $jsonSchema como BsonDocument
var schema = new BsonDocument {
{ "bsonType", "object" },
{ "required", new BsonArray { "_id", "name", "address" } },
{ "properties", new BsonDocument {
{ "_id", new BsonDocument("bsonType", "objectId") },
{ "name", new BsonDocument("bsonType", "string") },
{ "email", new BsonDocument("bsonType", "string") },
{ "address", new BsonDocument {
{ "bsonType", "object" },
{ "required", new BsonArray { "street" } },
{ "properties", new BsonDocument {
{ "street", new BsonDocument("bsonType", "string") },
{ "number", new BsonDocument("bsonType", "string") },
{ "zip", new BsonDocument("bsonType", "string") }
}}
}},
{ "books", new BsonDocument {
{ "bsonType", "array" },
{ "items", new BsonDocument("bsonType", "objectId") }
}}
}}
};
// Cria coleção com validator
await db.CreateCollectionAsync("authors",
new CreateCollectionOptions {
Validator = new BsonDocument("$jsonSchema", schema),
ValidationAction = DocumentValidationAction.Error,
ValidationLevel = DocumentValidationLevel.Moderate
});
InsertOneAsync(author) falha se Address ausente (1–1)InsertOneAsync(author) aceita sem Books (0–N)Para alterar o validator de uma coleção existente, use o comando collMod:
db.RunCommand(new BsonDocument {
{ "collMod", "authors" },
{ "validator", new BsonDocument(
"$jsonSchema", schema
)}
});
Avaliar a concepção inicial dos diagramas UML de sequência e classes, além da visualização total com base no diagrama de componentes do modelo C4, considerando possíveis mudanças nas próximas sprints.