Classe de dados oferecem interfaces de objeto às tabelas de banco de dados. Todas as classes de dados em uma aplicação 4D estão disponíveis como uma propriedade de datastore ds. Por exemplo, considere a tabela abaixo na estrutura 4D.

A tabela [Company] está disponível automaticamente como uma classe de dados na datastore ds. Pode escrever:
C_OBJECT(compClass)
compClass:=ds.Company
Esse código atribui à referência compClass a classe de dados Company.
Um objeto de classe de dados pode conter:
- atributos
- atributos de relação
A classe de dados oferece uma abstração do banco de dados físico e permite manejar um modelo de dados conceitual. A classe de dados é o único meio de pesquisar a datastore. Uma pesquisa é feita de uma única classe de dados. Pesquisas são construídas ao redor de atributos e nomes de relação de atributos. Assim os atributos de relação são os meios para envolver diversas tabelas interligadas em uma pesquisa.
Atributos de classe de dados estão disponíveis como propriedades de suas classes respectivas. Por exemplo:
nameAttribute:=ds.Company.name
revenuesAttribute:=ds.Company["revenues"]
Este código atribui ao nameAttribute e revenuesAttribute faz referência aos atributos name e revenues da classe Company. Essa sintaxe NÃO retorna valores contidos dentro do atributo, mas ao invés de retornar referências aos atributos em si. Para manejar valores, precisa ser através de Entidades.
Nota: Atributos de classe de dados são objetos que têm propriedades detalhados na seção ORDA - DataClassAttribute.
Atributos de classe de dados existem em várias formas: armazenamento, relatedEntity, e relatedEntities. Atributos escalares (ou seja, que oferecem apenas um único valor) são compatíveis com o tipo de dados 4D padrão (longint, texto, objeto, etc)..
- Um atributo de armazenamento é equivalente ao campo no banco de dados 4D e pode ser indexado. Valores atribuidos a um atributo de armazenamento são armazenados como parte da entidade quando é salvada. Quando um atributo de armazenamento é acessado, seus valores vêm diretamente da datastore. Atributos de armazenamento são os blocos de construção mais básicos de uma entidade e são definidos por nome e tipo de dados
- Um atributo de relação oferece acesso a outras entidades. Atributos de relação podem resultar em uma única entidade (ou nenhuma entidade) ou em uma seleção de entidades (de 0 a N entidades). Atributos de relação são construidos com base nas relações "clássicas" na estrutura relacional para oferecer acesso direto para entidades relacionadas. Atributos de relação estão disponíveis diretamente em ORDA usando seus nomes..
Por exemplo, considere a estrutura de banco de dados parcial e as propriedades de relação:

Todos os atributos de armazenamento estarão disponíveis automaticamente:
- no Project dataclass: "ID", "name", e "companyID"
- no Company dataclass: "ID", "name", e "discount"
Além disso, os atributos de relação abaixo também estão automaticamente disponíveis:
- no Project dataclass: o atributo theClient do tipo "relatedEntity"; há pelo menos uma Empresa para cada Projeto (o cliente)
- em Company dataclass atributo: companyProject, do tipo "relatedEntities"; Para cada Empresa há qualquer número possível de Projetos relacionados.
Nota: A propriedade Manual ou Automática de relação de banco de dados não tem efeito em ORDA.
Todos os atributos de classe de dados são expostos como propriedades na classe de dados:

Lembre que esses objetos descrevem atributos, mas não dá acesso aos dados. Leitura ou escritura de dados é feita através de entity objects. Para saber mais sobre como usar atributos de relação em entidades, veja Usar atributos de entidade.
Alguns métodos ORDA aceita referências de string como nomes de atributos e podem também ser aceitos referências de atributos. Por exemplos, considere abaixo:
localPeople:=ds.Employee.query("zipCode = 95113")
lastNames:=localPeople.toCollection("lastname")
Esse código define uma seleção de entidade de pessoas no CEP de código 95113. Depois produz uma coleção de sobrenomes. Ao invés de um valor de string representando um atributo, pode também usar uma referência de atributo como esta:
lastNameAtt:=ds.Employee.lastname
localPeople:=ds.Employee.query("zipCode = 95113")
lastNames:=localPeople.toCollection(lastNameAtt)
O objeto de classe de dados em si mesmo não pode ser copiado como um objeto:
$mydataclass:=OB Copy(ds.Employee)
As propriedades de classe de dados são entretanto enumeráveis:
ARRAY TEXT($prop;0)
OB GET PROPERTY NAMES(ds.Employee;$prop)