Pergunta

Eu estou projetando essa coleção de classes e abstrato (MustInherit) classes ...

diagrama de classes

Esta é a tabela de banco de dados onde eu estou indo para armazenar tudo isso ...

Tabela de banco de dados

Tanto quanto o banco de dados Microsoft SQL Server sabe, esses são todos anulável ( "Permitir valores nulos") colunas.

Mas, realmente, que depende da classe armazenado lá:. LinkNode, HtmlPageNode, ou CodePageNode

Regras pode ser assim ...

regras da tabela

Como faço para aplicar tais regras de integridade de dados dentro do meu banco de dados?


UPDATE: Em relação a este projeto de mesa única ...

Eu ainda estou tentando a zero em uma arquitetura final.

I inicialmente começou com muitas pequenas mesas com quase zero de campos nullalbe.
Qual é o melhor esquema de banco de dados para a minha navegação?

E eu aprendi sobre o LINQ to SQL IsDiscriminator propriedade.
Qual é a melhor maneira de lidar com um- para-um em SQL?

Mas então eu aprendi que LINQ to SQL suporta apenas herança única tabela.
Pode um LINQ to SQL coluna IsDiscriminator não herda?

Agora eu estou tentando segurá-lo com uma coleção de classes e classes abstratas.
Por favor, me ajudar com meus .NET classes abstratas.

Foi útil?

Solução

Use CONFIRA restrições sobre a mesa. Estes permitem que você use qualquer tipo de lógica booleana (inclusive em outros valores na tabela) para permitir / rejeitar os dados.

A partir da Books Online local:

Você pode criar uma restrição CHECK com qualquer (booleano) expressão lógica que retorna verdadeiro ou falso baseado na Operadores lógicos. Para o anterior exemplo, a expressão lógica é: salário> = 15000 eo salário <= 100000.

Outras dicas

Parece que você está tentando a Herança de Tabela Única padrão, este é um padrão coberto pela secção Padrões de objeto-relacional estrutural do livro Patterns of Enterprise Application Architecture .

Eu recomendaria o Class Herança Tabela ou padrões Concrete Table Inheritance se você deseja impor a integridade de dados através de restrições de tabela SQL.

Embora não seria a minha primeira sugestão, você poderia ainda usar Herança de Tabela Única e apenas fazer cumprir as restrições através de um procedimento armazenado.

Você pode configurar alguns insert / update gatilhos . Basta verificar se esses campos são nulo ou notnull , e rejeitar inserção operação / atualização, se necessário. Esta é uma boa solução se você deseja armazenar todos os dados na mesma tabela.

Você pode criar também criar uma tabela única para cada classe também.

Tenha uma tabela única para cada tipo de nó.

Porque não basta fazer a classe que você está construindo impor a integridade de dados para seu próprio tipo?


Editar

Nesse caso, você pode a) usar restrições lógicas (veja abaixo) ou b) procedimentos armazenados para fazer inserções / edições (uma boa idéia, independentemente) ou c) novamente, basta fazer a classe impor a integridade de dados.

Uma mistura de C & B seria o curso dos acontecimentos que eu tomo. Eu teria procedimentos armazenados únicas para ADD / edições para cada tipo de nó (ou seja Insert_Update_NodeType), bem como fazer a classe executa validação de dados antes de salvar dados.

Pessoalmente eu sempre insistem em colocar código de integridade de dados sobre a mesa em si, quer através de um gatilho ou uma restrição de verificação. A razão é que você não pode garantir que apenas a interface de utilizador irá atualizar inserção ou excluir registros. Também não se pode garantir que alguém pode não escrever um segundo sp para contornar os constrangimentos no sp orginal sem compreender as regras de integridade de dados reais ou até mesmo escrevê-lo porque ele ou ela não tem conhecimento da existência do sp com as regras. As tabelas são frequentemente afectadas por pacotes DTS ou SSIS, consultas dinâmicas a partir da interface do usuário ou por meio de Query Analyzer ou janela de consulta, ou mesmo por trabalhos agendados que executar código. Se você não colocar o código de integridade de dados no nível de tabela, mais cedo ou mais tarde os seus dados não terá integridade.

Provavelmente não é a resposta que você quer ouvir, mas a melhor maneira de evitar inconsistências lógicas, você realmente quer olhar para banco de dados normalização

Estêvão resposta é o melhor. mas se você deve, você pode adicionar uma restrição de verificação na coluna HtmlOrCode e as outras colunas que precisa mudar.

Eu não sou tão familiarizado com o SQL Server, mas eu sei que com o Oracle você pode especificar restrições que você pode usar para fazer o que você está procurando. Tenho a certeza que você pode definir restrições no servidor SQL também embora.

EDIT: Eu encontrei este link que parece ter muita informação, tipo de comprimento, mas pode valer a pena uma leitura.

impor a integridade de dados em bancos de dados Basicamente, existem quatro tipos principais de integridade dos dados: entidade, domínio referencial e definido pelo usuário

.

integridade entidade aplica no nível de linha; integridade de domínio aplica-se no nível da coluna, e integridade referencial aplica no nível da tabela.

  1. Entidade Integridade garante uma tabela não tem nenhuma linha repetida, e é unicamente identificado.

  2. Domínio Integridade requer que um conjunto de valores de dados cair dentro de um intervalo específico (domínio), a fim de ser válido. Em outras palavras, a integridade domínio define as entradas admissíveis para uma dada coluna, restringindo o tipo de dados, formato, ou gama de valores possíveis.

  3. integridade referencial está preocupado com manter as relações entre tabelas sincronizadas.

@Zack: Você também pode verificar este blog para ler mais detalhes sobre a aplicação da integridade dos dados, aqui- https://www.bugraptors.com/what-is-data-integrity/

SQL Server não sabe nada sobre suas classes. Eu acho que você vai ter que fazer valer isso usando uma classe de fábrica que constrói / desconstrói tudo isso para você e garante que você está passando os valores corretos, dependendo do tipo.

Tecnicamente isso não é "fazer cumprir as regras no banco de dados", mas eu não acho que isso pode ser feito em uma única tabela. Campos aceitar valores nulos ou não.

Outra idéia poderia ser para explorar Funções SQL e procedimentos armazenados que fazem a mesma coisa. Mas você não pode impor um campo para ser NOT NULL para um registro e NULL para a próxima. Essa é a sua camada de negócios / Fábrica de trabalho.

Você já tentou NHibernate ? É muito mais amadurecido produto do que Entity Framework. É grátis.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top