Modelagem De Dados: Exercício De Modelagem Lógica

Ao tentar aprender a arte do armazenamento de dados, tenho tentado absorver o máximo de informação sólida possível. O PerformanceDBA postou alguns tutoriais/exemplos realmente úteis nos seguintes posts, entre outros: Os meus dados estão normalizados? e Convenção de nomenclatura das tabelas relacionais . Eu já fiz uma questão de subconjunto deste modelo aqui.

Por isso, para ter a certeza que entendi os conceitos que ele apresentou e que vi noutro lado, queria dar um passo ou dois mais e veja se estou entendendo os conceitos. Daí o propósito deste post, que esperamos que outros também podem aprender. Tudo o que eu apresento é conceitual para mim e para aprender ao invés de aplicá-lo em algum sistema de produção. Seria legal para obter alguma entrada de PerformanceDBA também desde que eu usei seus modelos para começar, mas eu aprecio toda a entrada dada por qualquer um.

Como sou novo em bases de dados e especialmente como modelo, serei o primeiro a admitir que nem sempre posso faça as perguntas certas, explique meus pensamentos claramente, ou use o verdage direito devido à falta de conhecimento sobre o assunto. Por isso, por favor, tenha isso em mente e sinta-se à vontade para me guiar na direcção certa se eu me desviar do caminho.

Se houver interesse suficiente nisto, gostaria de levar isto das fases lógica a física para mostrar a evolução do processo e partilhá-lo aqui na pilha. Eu vou manter este fio para o diagrama lógico embora e começar um novo para os passos adicionais. Para minha compreensão, eu estarei construindo um DB MySQL no final para executar alguns testes e ver se o que eu cheguei com realmente funciona.

Aqui está a lista de coisas que quero capturar neste modelo conceptual. Editar para V1.2

    O objectivo disto é listar as bandas, os seus membros e os Eventos em que irão aparecer, bem como oferecer música e outras mercadorias para venda.
  1. Os membros serão capazes de combinar com os amigos
  2. Os Membros podem escreva críticas sobre as bandas, sua música e seus eventos.
    • só pode haver uma revisão por membro em um determinado item, embora eles possam editar suas revisões e a história será mantida.
    • Os membros da banda terão a oportunidade de escrever um único comentário sobre as críticas sobre a Banda a que estão associados. Coletivamente, como uma banda, apenas um comentário é permitido por revisão.
    • Os Membros podem então avaliar todas as revisões e comentários, mas apenas uma vez por dado instância
  3. Os membros podem escolher as suas bandas favoritas, música, mercadoria e eventos.
  4. bandas, músicas e eventos serão categorizados no tipo de gênero que eles são e, em seguida, mais subcategorizadas em um subgênero, se necessário. É ok para uma banda ou evento para cair em mais de um gênero/subgênero combinação.
  5. Data, hora e local do evento serão postados para uma determinada banda e os membros podem mostrar que eles estarão presentes no evento. Um evento pode ser composta por mais de uma banda, e vários eventos podem ocorrer em um único local no mesmo dia
  6. Todas as partes estarão ligadas a pelo menos um endereço e a história dos endereços será mantida. Cada parte poderia também estar ligada a mais de um endereço de cada vez (ou seja, facturação, expedição, material) Haverá perfis armazenados para bandas, membros de bandas e membros gerais.
Então lá está ele, talvez um pouco envolvido, mas pode ser uma grande ferramenta de aprendizagem para muitos. Esperemos que à medida que o processo evolui e a contribuição é dada pela comunidade. Alguma informação?

alt text

editar v1. 1 Em resposta ao PerformanceDBA

U. 3) isso significa nenhuma mercadoria além de mercadoria da banda na base de dados. Correcto ? Esse era o meu pensamento original, mas fizeste-me pensar. Talvez o site gostaria de vender sua própria mercadoria ou mesmo outra mercadoria das bandas. Não tenho a certeza se um mod para fazer isso. Seria necessária uma reformulação completa do Secção de catálogo ou apenas a relação de identificação que existe com a banda? Tentou um mod para vender os dois álbuns completos ou música. De qualquer forma, ambos estariam em formato eletrônico apenas disponível para download. É por isso que listei um álbum como sendo composto de canções em vez de duas entidades separadas.

eu entendo o que você fala sobre a relação circular com o favorito. Eu gostaria de chegar a isso " é uma entidade com alguma forma de diferenciação (FavoriteType) que identifica seu tratamento" mas como não é claro para mim. O que me está a escapar?

U. 6) [[17] " regras de Negócio esta é provavelmente a única área em que você está fraco."
Obrigado pela resposta honesta. Vou ler estes, mas espero esclarecer alguma confusão na minha cabeça primeiro com as respostas que eu postei de volta para você.

Sim, gostaria de ter aceitado, rejeitado e bloqueado. Não sei ao que se refere como isso mudaria o modelo lógico?

Q. 2) uma pessoa não tem de ser um utilizador. Eles só podem existir como um membro da banda. É isso que estás a perguntar?

Questão Menor

Zero, Um, ou mais ... admito que me esqueci de dar atenção ao construir o modelo. Estou a enviar esta versão como está e irá abordar numa versão futura. Preciso ler mais sobre a verificação de Restrições para ter certeza que estou entendendo as coisas.

M. 4) Depende se você prevê compra de ordenados no futuro. Pode explicar o que quer dizer aqui?

alt text

editar V1. 2 Em resposta à entrada do PerformanceDBA...

lições aprendidas.

    Eu estava misturando o conceito de identificação / não-identificação e cardinalidade (ou seja, gênero / subgênero), e fazendo isso de forma inconsistente para piorar as coisas.
  1. tabelas associativas não são necessárias em diagramas lógicos como as suas muitas-para-muitas relações pode ser representado e, em seguida, expandido no modelo físico.
  2. Estava a ignorar a cardinalidade em muitas das relações.
  3. a importância de ler através de relacionamentos usando frases verbais eficazes para tranquilizar que estou modelando o que eu quero realizar.

U. 2) no conceito deste modelo só é necessário seguir um local como um local para um evento. Não é necessário recolher mais dados. Com isso dito, os eventos terão lugar em um dada Data de Evento e será hospedado em um local. Os locais acolherão vários eventos e, possivelmente, vários eventos em uma determinada data. No meu novo modelo, pensei que a data do evento já está ligada ao evento . Portanto, o Local não precisará de um relacionamento com a data do evento. As 5ª e 6ª balas que você listou na U. 2) me deixam questionando meu pensamento embora. Está a escapar-me alguma coisa?

U. 3) é hora de mover o link entre Item e Banda Para Item e festa em vez disso? Com o design atual não vejo a possibilidade de vender mercadoria não ligada à banda como você criou.

U. 5) saí de acordo com a tua entrada, em vez de fazer dela uma relação discreta de supertipo/subtipo, pois não vejo vantagem em ter esse tipo de rolo.

Revisões Adicionais

AR.1) Depois de passar pelo exercício para FavoriteItem, eu sinto que o Item a rever requer uma relação de muitos-para-muitos de modo que é indicado. Necessário? enter image description here

ok aqui vamos nós para v1.3

Levei alguns dias nesta versão, indo e voltando com o meu design. Uma vez que o processo lógico esteja completo, como eu quero ver se estou no caminho certo, eu vou passar em profundidade o que eu tinha aprendido e os problemas que eu enfrentei como um iniciante passando por este processo. O grande ponto para esta versão foi que foi preciso jogar algumas chaves para ajudar a ver o que eu estava faltando no passado. Passando pelo processo de fazer uma matriz provou ser de grande ajuda também. Independentemente de qualquer coisa, se não fosse a entrada dada pelo PerformanceDBA, ainda seria uma alma perdida a pensar no escuro. Quem sabe meu projeto atual pode reafirmar que eu ainda sou, mas eu aprendi muito para que eu sei que pelo menos tenho uma lanterna na minha mão.

Neste momento, admito que ainda estou confuso quanto a identificar e não identificar relações. No meu modelo tive de usar relações não-identificadoras com não nulls só para se juntar às relações que eu queria modelar. Ao ler muito sobre o assunto, parece haver muita discordância e indecisão sobre o assunto, então eu fiz o que eu achava que representava as coisas certas no meu modelo. Quando forçar (identificar) e quando ser livre (não identificar)? Alguém tem entradas?

enter image description here

editar V1.4

Ok pegou nas entradas V1. 3 e limpou as coisas para este V1. 4

actualmente a trabalhar num V1. 5 para incluir atributo.

enter image description here

editar V1.6

Está bem, já passou algum tempo desde que eu postei aqui, mas o trabalho neste projecto ainda está em curso. Estou postando V1. 6 Agora, que inclui uma série de mudanças a partir da última postagem de V1.4. Esta versão mostra a evolução das chaves. Ele ainda não inclui os atributos ou qualquer AK's ou IE'S. Eu comecei a trabalhar no modelo físico e usado que para ajudar a trabalhar através dos atributos e para tentar e shed some light on the problems I am having with defining the AK's and IE's. The next posting of the Logical Model will include these keys and the attributes.

enter image description here

Author: swisscheese, 2011-01-23

2 answers

Aviso de recepção

Devo dizer que fez um trabalho fantástico na (a) ([75]}agarrar os elementos de modelização fornecidos na sua pergunta anterior e (B) ([75]} aplicá-los. Percorreste um longo caminho em apenas um dia. É um reforço maravilhoso do fato de que, dada a educação correta, pessoas capazes são capacitadas para fazer grandes coisas, para sair do seu próprio poder.

Método

Dado o teu objectivo declarado, e sua capacidade demonstrada (para não mencionar, o primeiro seeker com quem lidei assim, para perguntas de design Db que postou um ERD em vez de um grupo DDL), eu não vou fornecer respostas. Dar-vos-ei instruções e orientação, e terão de avançar com o vosso próprio modelo.

É claro que também vou tratar de pormenores, mas vou cobrir uma ou duas áreas de estudo completamente, não todas. Você pode pegar isso e aplicá-lo em todas as áreas de estudo. Eu não respondi ao núcleo Área de estudo, porque ainda estamos a lidar com entidades identificadoras. Quando isso for resolvido, o Reviews, etc será mais fácil; as Entidades de transacção dependem das entidades identificadoras.

Direcção

Eu sei que disse que precisava de ver o modelo todo. Há uma excepção. Dados históricos, temporais ou de auditoria (p.ex. a edição e versões armazenadas). Nesta fase inicial, podem ser postas de lado; a serem implementadas imediatamente antes da conclusão do Modelo Lógico. Isto é em reconhecimento que (a) eles são dependentes simples de algum pai (B) os pais precisam ser modelados em relação a todas as outras tabelas primeiro, e (C) para excluir complicações desnecessárias, e, assim, permitir-nos concentrar no campo relevante.
  • em particular, você pode ignorar o tempo nas frases verbais (cada localização de uma tabela de versões necessitaria de Has/Had). Fique com o tempo presente por agora, porque o foco é modelar, não arquivamento.

Não resolvido

U. 1) Pais Facultativos
Isso é completamente proibido. Não só pelo IDEF1X, mas por qualquer noção de integridade. Se a referência FK é definida, então deve haver um pai. Para permitir pais opcionais, A referência FK deve ser removida (ou não implementada). Tal condição excluiria o resultado da qualificação como um" banco de dados relacional", por definição. Exemplo. Address:Order.

    É claro que, nos países desenvolvidos, Order deve ter um Address por razões legais ou fiscais; isto é separado da questão do requisito Padrão.
    .
([74]}U. 2) Evento
Party::PartyAddress está correcto; Address::PartyAdress está correcto. Precisa de trabalho. O endereço é uma tabela de referência identificadora; se usado, seria o pai, Event seria a criança. Deixo-te a TI identificar / modelar múltiplos Events para um local, e {[9] } em um ou vários locais.
  • Pode haver um local envolvido. Ou um EventOccurrence

  • Mas se for um Event genérico que acontece em vários locais, que não precisa de uma entidade, o Address já está em Order.

([74]}U. 3) assumindo que Catalog é uma entrada no sentido tradicional (JCPenney 2011), uma lista de itens para venda ou locação.
  • OrderSaleItem está correcto.

  • Ponto crítico. Catalog é dependente, e só pode existir no contexto de um Band, como um conjunto. Fino. Isso significa que não há mercadoria. além da mercadoria da banda na base de dados. Correcto ?

  • Eu posso ver como "Evening performance with the Blues Brothers" é um Event que pode ser encomendado, facturado, e pago. Também revisado, comentado, etc.

  • Não consigo ver como é que isso se encaixa. As bandas estão a vender álbuns, canções ou ambos ?

  • Não há outra banda merhandise: lembranças de Concertos/Eventos; cartaz; óculos de tiro gravados ?

  • Consistente com as Convenções de nomeação que você faz referência, e o resto da base de Dados, Catalog (o cotent) deve ser nomeado Item (a linha). Você já (naturalmente ?) usou isso em OrderSaleItem, (em oposição a OrderSaleCatalog.

U. 4) Género

  • Não há problema com an Item is classified by one-to-many Genres.

  • Acho que adicionalmente. A relação é de um para muitos (que será resolvida como uma tabela associativa quando chegarmos ao físico).

([74]}U. 5) Favorito
A cardinalidade de Item::Favorite é invertida. Quando corrigir isso, a área de estudo Favorite exigirá mais modelos.
  • Relação Circular ou caminhos duplos entre o mesmo par de Entidades é um sinal de um modelo não resolvido. Geralmente um é correto e o outro é redundante. (Há exceções, mas não aqui; e quando isso acontece as frases verbais as diferenciam.)

  • Ou Band::Favorite xor Item::Favorite está correcto, não está quer.

  • Item::Favorite parece estar correto, porque Band já está identificado em Item

  • Da mesma forma, uma entidade para bandas e {188]}mercadoria não parece sólida. Cada identificador na única entidade Favorite é um Party. Isso iria quebrar quando Normalizarmos, mais vale exigir que os identificadores sejam clarificados nesta fase. Ou é uma entidade com alguma forma de diferenciação (FavoriteType) que identifica o seu tratamento; ou uma entidade Para as bandas e outra para as mercadorias, caso em que não é necessária diferenciação, a ambiguidade é eliminada.

([74]}U. 6) Regras De Negócio Esta é provavelmente a única área em que estás fraco. Resposta geral. Você fez as tarefas separadamente (todos os modelos vs escrever BRs). Estes não coincidem com o modelo. Quando você passar pelo próximo ciclo, tome as regras de negócio como diretrizes, e as module ao mesmo tempo, como com as Entidades, as relações, e o verbo Frase.

Pergunta

Q. 1) Utilizador / Amigo
Tens a essência disso perfeitamente. E a cardinalidade das relações. (Tratamento completo neste.) Isso é correto para aceito Friend.

  • Portanto, o tempo deve ser passado (ir com as linhas da maioria)

  • Requested, e pendentes Accepted, são a minoria. Facilmente implementado em um Bit IsAccepted OU booleano.

  • Mais tarde poderá ter IsRejected ou IsBlocked (esta última deve ser uma entidade separada).

  • É disso que precisas ?

Q. 2) Qual é a base sobre a qual a Person is zero-to-many Users ?

Questão Menor

Apenas Singular.

M. 2) Party Has zero-to-many Addresses. Eu acho que eles devem ter um, a fim de realizar negócios (mas talvez não para todos ([47]).

M. 3) Order May Have zero-to-many Payments. "Requer" significa que primeiro Payment tem de ser inserido ao mesmo tempo que Order.

  • da mesma forma, para qualquer criança obrigatória (um-para-muitos em oposição a zero-para-muitos) que o primeiro filho deve ser inserido ao mesmo tempo que o pai. Isto é feito através de transacções em bases de dados de empresas, porque verificação de restrições imediatas (Não diferido) é implementado; e o pequeno fim da cidade luta por coisas tolas como verificação de restrições diferidas é "melhor" e depois passar metade da vida a descobrir como Não para obter apanhados nos laços infinitos que criaram, que os aprisionam. MyNonSQL não tem nenhum, então nada com que se preocupar para esta implementação.

M. 4) OrderSaleItem deve ser OrderItem xor Order deve ser OrderSale. Depende se você imaginar OrderPurchase no futuro.

▶Exemplo Da Área De Estudo◀

Os leitores que não estão familiarizados com o padrão de modelização de bases de Dados Relacionais podem encontrar ▶Notação IDEF1X◀ util. Como já foi dito, não estou a fornecer um modelo de dados acabado, apenas orientações. Esta é apenas uma progressão de uma área de estudo seleccionada. Não é "certo" ou completo de qualquer forma.
  • As tuas frases verbais são excelentes. Eu tenho fornecido alternativas para você considerar, eles não são" certo "ou"melhor". você precisa escolher um progresso deles ou o seu próprio. O objetivo é o VP mais conciso e preciso em cada caso.

  • Não. suggestion that Person is correct and User is incorrect, that is pending your answer. Mas eu tive que usar algo no modelo; uma vez que você os modelou como separados, um contraponto pode ser interessante de avaliar.

Ok, então vá em frente e progrida o modelo, em seguida, postar novamente (basta editar a pergunta, deixando o cabeçalho pares, e substituindo o resto).

V1.1 e resposta

Isso é certamente uma progressão.

Voltei a numerar os itens em formato pseudo-legal, incluindo os títulos de seção, para que possamos manter a numeração por todo, e continuar adicionando a ele. Na verdade, ele realmente alivia os problemas de edição SO também.

Seria necessária uma reformulação completa da secção do catálogo ou apenas a relação de identificação que existe com a banda?
  • Não. Essa é a grande coisa sobre trabalhar neste nível, as decisões que você toma aqui serão os trilhos de trem que os dados correm on, as freight, or does not run on (and thus needs alternate transport and heavy lifting to derive, in the form of masses of code or an additional data warehouse). E as decisões aqui são baratas (tempo de modelagem, papel).

  • Neste momento, um Item só existe no contexto de uma banda. É dependente. Para permitir mercadoria não-band, ele precisa ser independente. E então o grupo de super/subtipo existente precisa de ser retrabalhado.

tentativa de mod para vender os dois álbuns completos ou música. De qualquer forma, ambos estariam em formato eletrônico apenas disponível para download. É por isso que listei um álbum como sendo composto por canções

    Está bem. Mas agora só podes vender álbuns, Não canções.

em vez disso, duas entidades separadas.

  • Não sei ao certo o que quer dizer (você tem [[187]}duas entidades separadas).

  • Parece que não viste o meu ▶Exemplo Da Área De Estudo◀. nota que se a abrir agora, ela contém bits que eu adicionei aV1.1 ; eu tenhoque não mudou o que estava lá ontem, a resposta V1.0.

  • Na verdade, isso significa que você deve passar por minha resposta V1.0 novamente, ao ver o exemplo.

[74]}U. 5) ... mas como não está claro para mim. O que me está a escapar?
  • Um exemplo de uma entidade com diferenciação é qualquer um dos grupos de supertipo / subtipo que você tem. O favorito é o Supertype, BandFavourite e ItemFavourite são subtipos, permitindo que cada um faça referência ao Item de banda xor, respectivamente.

  • Você o modelou como favorito. Agora a questão é, o fato de uma ItemFavourite implica que a banda é favorita; ou é BandFavourite um fato discreto ? No exemplo, eu modelei este último, sem o favorito:: Éfavorita/BandFavourite estrutura.

Sim, gostaria de ter aceitado, rejeitado e bloqueado. Não sei a que se refere a alteração do modelo lógico.
  • Nenhuma alteração (eu já disse que estava bastante completa) para V1.0, mas você pode precisar de uma entidade adicional.

  • Precisas de três indicadores booleanos Em Amigo. Isso irá servir estes estatutos:
    • Requested (mas não Aceite)
    • Requested & Accepted
      .
  • mas bloqueado não é um amigo (ou poderia ter sido um amigo anteriormente, mas não desde que foi bloqueado). Assim, ou o nome da entidade tem que mudar para refletir que (nenhuma mudança nas duas relações) XOR Bloqueado tem que ser uma entidade separada. Dois significados separados para a segunda relação leva à complexidade, Portanto eu iria com a última.
Com o primeiro, temos mais Estados:
  • Blocked
    .
    • em seguida, as frases verbais precisam de mudança (e eu vou incluir o RoleName para clareza), e um deles tem um significado alternativo. .
    • (será muito mais claro no modelo de Nível de atributos, é por isso que nós modelamos em imagens, não palavras; então eu incluí isso.)

Q. 2) uma pessoa não tem de ser um utilizador. Eles só podem existir como um membro da banda. É isso que tu és? perguntar?

  • Não. Por que precisamos diferenciar pessoa e usuário ? Quais são as ações ou atributos separados ? Até agora, eu vejo pessoa e usuário como a mesma entidade; pessoa é um usuário sem atividade.

  • Este é o último item, impedindo-nos de lidar com a área de assunto central.

Preciso de ler mais sobre a verificação de Restrições para ter a certeza que estou a perceber as coisas.
    Não! preocupe-se com isso agora; eu estava dando-lhe razões para mantê-lo simples (os NonSQLs parecem simplificar as coisas, mas na verdade eles tornam-no mais complexo). MyNonSQL não tem nenhuma dessas capacidades, então você pode eliminar a consideração da plataforma, e apenas modelar a cardinalidade significantemente.

M. 4) depende se você previr compra ou compra no futuro. Pode explicar o que quer dizer aqui?

  • No contexto do modelo. Você fornece o estruturas de fabrico de aparelhos de venda (de artigos). Portanto Item, ordem e OrderItem.

  • Mas se forneceu as estruturas para acompanhar também os aparelhos de compra (para comprar artigos, bem como material de escritório, aluguer, etc.), então precisa de diferenciar as ordens de venda e as ordens de compra. Portanto:

    • Item
    • OrderSale e OrderSaleItem
    • compra e compra a encomenda

Versão 1.1

U. 2) O Acontecimento Progrediu

  • O Encontro parece bom. Eu definiria a relação como Event Was Perfromed On EvenDate.

  • Considerando que o ItemGenre é perfeito, o evento::o local Precisa de trabalho. Este é um erro que você faz consistentemente, então uma explicação é necessária.

    • Você modelou Venue corretamente, é independente e existe fora do contexto de Event. Mas Event May Be [Held] At zero-to-many [Independent] Venues não é possível.

    • Eventos são realizados em muitos Locais, e locais hospedam muitos eventos. Se isso foi tudo, uma vez que este é o nível lógico, você pode desenhar uma relação de muitos para muitos, e você está feito. No nível físico, essa relação é resolvida pela implementação de uma tabela associativa, da qual o PK é o PKS pai, e não há dados. (O inimigo é um bom exemplo.)

    • Mas se houver dados (por exemplo. você precisa acompanhar a data ou número de participantes ou o que quer que), então não é uma tabela associativa, é outra entidade. A O que acontece entre o evento e o local.

    • A data do evento é um bom candidato. Já temos isso e a data. Basta adicionar espaço e agitar. Eu chamaria de espectáculo aquilo que acontece entre o evento e o local.

  • Da mesma forma, o EventAddress progrediu, mas não está completo.
    • Os Eventos têm Moradas ou locais têm Moradas ? (modela-o, sem necessidade de palavras)

    • Se local: do você precisa de todos os endereços históricos para o local (como festa), ou apenas o atual (como ordem) ?

([74]}M. 5) Subgénero. Você pode explicar por que o subgênero é (a) Independente e (B) A relação não é identificadora.

M. 6) Item Is zero-to-many Favourites. Portanto: Item Is a Favourite of zero-to-many Users Igualmente. Portanto Each User Chooses zero-to-many Favourite Items

V1.2 e resposta

Grande Progresso.

U. 2) O Acontecimento Progrediu Ainda Mais

Indo pela sua edição, bem como pela nova Requisitos, alguns Sim e outros não. Todas as outras áreas temáticas do modelo de dados são praticamente completas( para Lógica), esta área é confusa, não quase tão resolvida. Em parte devido aos requisitos adicionais (nenhuma queixa, que acontece na vida real; é sobre como você lidar com isso). O principal ponto que vou focar aqui é que o modelo de dados deve sempre modelar o mundo real, em oposição apenas à exigência de Negócio. Que a) isola o DM do efeito da mudança e B) oferece uma plataforma sólida para requisitos adicionais. Isso não significa que você tem que modelar todo o mundo real, mas as partes dele que você faz modelar deve refletir a realidade e não ser esmagado para preencher apenas o requisito.

Em segundo lugar, há falta de clareza sobre as distinções entre Evento, Band-Evento, Performance, etc. Neste momento, um evento é um evento de Festa-Banda-Item. Tudo bem, mas não funciona para o novo evento de estilo por exigência.

Terceiro, tem um bom dia. trata da mudança de Morada, Mas não do local.
  • Uma vez que está a aceitar o modelo padrão e, portanto, o tratamento, o endereço é uma tabela de referência.

    • É independente (cantos quadrados)

    • Na verdade, você pode colocar endereço e tudo acima dele na página um; fazendo esta parte da Página Modelo dois, e ter Endereço apenas nesta página.

    • Correctamente modelizado: uma parte tem um histórico de moradas. Devem ter pelo menos um endereço actual { IsBilling | IsShipping | IsPhysical}, baseado em qualquer actividade que esteja a ser executada.

    • Modelado corretamente: uma ordem tem um endereço IsBilling (se você precisar de IsShipping, você precisa adicionar uma relação separada).

  • Endereço não é um filho do local (também independente, correto). Não creio que um local esteja localizado em zero-a-muitos endereços. (Maybe that is the old Cardinalidade-erro invertido, mas eu não tenho certeza, devido à outra confusão Re Evento e local.)

  • Na verdade Endereço::: Ordem é suspeita. (Q. 3) você quer ordem para indicar qualquer endereço válido, ou um endereço específico para a parte que executa a ordem ?

  • De volta ao evento. A aceitar a data do evento declarada. Isso é bom, mas, em seguida, comentários etc, aplicar ao concerto genérico e não o único concerto que eles tocaram em cogumelos. Vai em frente. V1. 3.
    • Seu evento terminológico re, etc é consistente com o requisito, etc. mas não apoia a exigência, como foi afirmado.

    • Então vamos começar a usar o "evento" da maneira que ele é usado no mundo real, e modelá-lo dessa forma. O que temos chamado de "Evento", o item de banda-festa, é na verdade uma Performance. E não um genérico que está agendado, mas um único num local específico.

    • Ou era isso que querias dizer com A data do evento ou a data do evento se resolvem em Performance.

Se não se importa, evitarei escrever mil palavras e dar-lhe-ei uma fotografia. ▶Exemplo V1 Da Área De Estudo.2◀
  • Observe que as múltiplas bandas por evento são resolvidas.

  • E as frases verbais vêm directamente do céu. Um endereço hospedou vários locais, cada um dos quais recebeu vários eventos, cada um dos quais é múltiplo Performances, cada uma das quais é uma festa-Band-Item.

Está na hora de mudar a ligação entre o Item e a banda para o Item e a festa? Com o design atual não vejo a possibilidade de vender mercadoria não ligada à banda como você criou.
  • Primeiro, precisamos usar a terminologia relacional, não porque eu seja um pedante, mas porque os verdadeiros gurus dizem que realmente ajuda a fazer a transição para a relacional. mundo.

  • Em segundo lugar, não podemos conseguir isso "movendo a relação".

  • Você tem que modelar mercadoria não-Band: como você está indo vendê-lo; rastreá-lo; ser pago por ele. Se você quer críticas e Respostas, etc. Não vejo que Partido tem a ver com isso, e neste momento estamos a vender itens de banda, não Itens de festa. Considere as questões de integridade referencial.

Versão 1.2

AR.1) depois de ir através do exercício pelo FavoriteItem, eu sinto que o Item a rever requer uma relação de muitos para muitos de modo que é indicado. Necessário?

  • Em V1. 1, Um Item teve muitas revisões, e uma revisão foi sobre um Item. Uma pessoa gerou muitos comentários (um por Item). Isso é lógico.

  • A Review is about many Items não é razoável.

  • ([74]} se alguma coisa, agora que o Favoriteitem/Favoriteband está resolvido, a revisão precisa igualmente de resolução e distinção: precisamos diferenciar a visão de banda da visão de ItemReview; uma visão de Item Bom / Ruim indica uma visão de banda boa/ruim ou são discretos ?
    • Uma Revisão (como está) não pode ser sobre ou uma Banda ou um Item. Isso significa duas chaves estrangeiras, e uma do will Null, e FKS nulos não são permitidos. Item e Banda são sempre diferenciados, e essa diferenciação é madura.

    • As revisões podem ser resumidas, etc., mas isso é uma história diferente.

Isso deixa-nos com uma nova questão para resolver. Se uma revisão pode ser sobre uma banda ou álbum ou música ou Performance, como podemos garantir que a integridade referencial. Não precisamos de um AlbumReview para referenciar um SongReview, etc. Modela-o.

R. 5) o modelo actualmente fornece o género ao nível dos itens, o que significa álbum e música (a mercadoria Pode ser proibida através de uma restrição de verificação). Não É Banda. Isso pode ser suficiente, dado que (a) bandas mudança ao longo do tempo, (b) esse tipo de classificação no nível do Item é mais preciso, e (c) gênero de banda pode ser facilmente derivado de seus álbuns ou músicas.

  • Se você precisa de gêneros de banda separados, você precisa adicionar isso.

  • E o género do evento ? Se precisares, acho que será um género por evento.

  • Tenha em mente que tabelas como o local e o gênero são critérios de busca sérios em uma base de dados principal. Vetores para análise.
      Os rapazes do armazém de dados precisam de adicionar isto às dimensões dos factos. numa base de dados devidamente modelada, já existem como dimensões dos factos. Mostra - me todos os locais com eventos de "música folclórica" programados que atraíram mais de 10.000 pessoas é muito fácil.
      .
Ponto De Discussão. Não dizer o acima é incorreto. O que eu encontrei em ambos os bancos de dados e iTunes é, a precisão conta. Por que laissez faire gênero:: várias coisas quando você pode ter gênero::: coisa específica. Se você tivesse gênero: apenas Música, e música tem um gênero apenas, então álbum e Banda São enrolamentos precisos. A forma como o temos agora, depende do conhecimento musical da pessoa de entrada de dados, e gênero::coisa é muitos, por isso é solto. Género:: a música é apertada.

R. 6) os membros podem mostrar que irão assistir ao evento não é inspirado. Também clarifica juros vs reservas vs atendimento.

R. 8) não é modelado.

([74]} M. 3) a questão está encerrada, mas a frase verbal permanece inalterada. ([74]} M. 7) tabelas associativas do modelo lógico vis-a-vis. Agora que essa questão está fechada, remova quaisquer tabelas associativas para o modelo lógico; quaisquer tabelas restantes (entre dois pais) conterão dados. Isso significa, passar por todas as tabelas dependentes e remover qualquer que não tem dados. Assim, V1. 3 deve ser menos confuso.

M. 8) o Item é OrderItem.

[[74]} M. 9) Agora que o Utilizador da festa está resolvido. Uma estrutura de subtipo exclusivo requer um discriminador, e o constrangedor será usado para impor a integridade. Onde há muitos, PartyType é o caminho a seguir. Mas para apenas dois, uma coluna IsBand ou IsPerson é adequada. ([74]}M. 10) corrigiu o erro de inversão da cardinalidade, mas algumas frases verbais continuam a ir na direcção errada.

27 Jan 11

Na verdade, acho que muitos destes as questões seriam mais claras se passássemos para o nível de Chave lógica/atributo (em vez de apenas o nível de relação de entidade). E já é tempo de o fazermos. Por exemplo: Ordem: a morada é suspeita. A restrição não é completamente correta porque isso permitiria que a ordem tivesse qualquer endereço, não um endereço que é específico para a parte que executa a ordem. Mas como você é o MyNonSQL, que não tem integridade referencial, você pode não estar ciente de como é feito em real SQL, então eu vou fornecer as definições FK, que acontece ser Ri restrições também. É um pouco injusto esperar que compreendas as minhas afirmações terse, que se baseiam na RM, Normalização e são apoiadas pela SQL, quando não tens SQL.
  • para que as duas restrições sejam verdadeiras, uma vez que o partido deve ser o mesmo em cada restrição (existe apenas um Order.PartyId), apenas o subconjunto do PartyAddress que pertence ao PartyId, será permitido.

▶Exemplo De Qualificação Do Endereço◀

Continued in Part II...

 8
Author: PerformanceDBA, 2011-01-29 16:16:33

... Parte II

V1. 3 e resposta

Santo Toledo ! Estás a cozinhar com gás, jovem. Todas as questões são menores, ou se relacionam com o novo passo que você está aprendendo.

Identificadores vs colunas de Id

Não vou dar-lhe um resumo completo aqui, já que postei pelo menos 20 vezes sobre como as colunas incapacitam uma base de dados e roubam-na De Poder relacional. Abordarei a questão no contexto desta pergunta. apenas.
  • Aqui está.▶ um exemplo◀, verifique a questão em pormenor primeiro. Note que Mark é bastante capaz, mas completamente preso. então leia a minha resposta, depois olhe para o modelo de dados. (Por favor, faça isso agora, ele fornece contexto)

  • A idéia é ou modelar os dados, como dados, o que estamos fazendo, e você vai acabar com uma base de dados, XOR Stick Id colunas em tudo o que se move, o que impede o exercício de modelagem e Normalização, e você vai acabar com um monte de planilhas "ligadas" um ao outro com duplicação maciça e sem desempenho.

  • Por isso, remova todas as colunas do formulário [Table]Id de todas as tabelas (deixe as chaves migradas em paz, elas estão correctas), excepto As tabelas seguintes (estas são as principais , reflectidas em toda a base de dados. Note como ERwin corrigirá todas as crianças, netos, etc. tabelas:
    Party
    Address
    Item

Identificadores relacionais / IDEF1X

Estás a aprender sobre identificadores. Estas são as chaves naturais. Ou chaves que o utilizador usa, ou chaves que foram migradas de um pai para um filho como chaves estrangeiras. Por conseguinte, não só identificam a relação, mas também identificam a criança. O teu sobrenome diz-me não só sobre ti, mas também sobre o teu pai, e também que tu és o teu o Filho do Pai. Queres tornar isso único ? Não há problema, basta adicionar um primeiro nome.

Tens estado a ler as minhas respostas, a olhar para os meus modelos de dados, e depois a adicionar identificadores ao teu modelo. É muito mais fácil do que isso. O ERwin (uma vez que implementa o IDEF1X) faz isso por si.

  • Festa, Banda e pessoa. O identificador da parte é PartyId
    (ok, essa é uma chave substituta, não uma chave Natural; mas a chave Natural Lastname, FirstName,BirthDate, etc. é muito longo, se usarmos que, como chave principal, seria migrado para os filhos, netos, bisnetos, o que não é desejável, então nós adicionamosuma chave substituta curta, e tornamos essa a chave primária)

  • Quando você criar os subtipos em ERwin, e indicar a Relação, ele irá automaticamente colocá - PartyId em Banda e Pessoa, como o PK; ele irá marcá-lo como "(FK)". (Nota: eu uso fonte negrito para denotar (FK) em Meus modelos.)

  • É isso, estás feito. Partido:: a banda é 1: 0-1, a chave primária da banda é PartyId. Como é um subtipo, ERwin irá garantir que a relação é identificando , e portanto o PK Pai acaba no PK filho, e o filho dependente tem cantos redondos.
    • Se subtipos foram não envolvidos, seria o mesmo, exceto que a Relação não pode ser de 1::0-1, ele pode ser: 1::1-n. Nesse caso, você precisa adicionar mais um elemento para torná-lo exclusivo, como fFirstName, ou SequenceNo
    • E tens de o fazer. indique ao ERwin que deseja uma relação identificadora. (Se não o fizer, então é um FK simples, e as colunas estarão abaixo da linha; a tabela será independente,; o quadrado dos cantos).
  • e se, em algum momento, decidir usar essas colunas FK para formar o PK, basta carregar na relação e alterá-la de não-identificadora para identificação; as colunas serão movidas acima da linha; os cantos serão redondos.

Papel

  • Agora, o próximo passo. Nós sabemos que a banda:: partido é 1:: 1; essa banda é uma criança Do Partido; que Band.PartyId é a PK perfeita (não Id coluna é necessária). O mesmo para a pessoa. Mas eles são nomes tolos, ou dito de outra forma, banda é na verdade um papel diferente para a pessoa, e eles são ambos uma festa. Por isso, queremos identificar claramente o papel.
    • Na banda, gostaríamos de chamar PartyId, BandId, para reflectir o seu papel. Edite a relação , entre o símbolo do subtipo e a criança, não a tabela. No diálogo, preencha o nome de RoleName como BandId. É isso. Acabou.

    • Assim, a seguinte mudança de ... to: {[0]} Consequentemente ... {[1]}

  • Remover todas as colunas [Table]Id irá deixar as seguintes tabelas sem um PK. Por agora, adicione uma coluna Name como o PK. Você pode me dizer mais tarde o que o usuário gostaria de uma chave natural, um identificador para estas tabelas: Evento
    Género

  • PartyAddress é um exemplo (ie. modelado corretamente) de tudo o que eu discuti acima. Não tinha. PartyId e AddressId juntos formam o PK. Ambas as relações identificam-se.

Identificação contra relações não identificadoras

ao ler muito sobre o assunto, parece haver muita discordância e indecisão sobre o assunto.

  • Sim. Infelizmente, qualquer um com um teclado e um modem pode "publicar" hoje em dia. As pessoas postam opiniões como fatos; postam disparates sobre assuntos sobre os quais não têm noção. Isso confunde pessoas que estão tentando aprender.

  • É ciência, não magia ou arte negra, não opinião.

  • Ao aprender, leia apenas definições, e ouça apenas as pessoas que claramente transferem a ciência (não para quem está confuso ou trata a ciência como se fosse uma arte ou que está sujeita a opiniao). Estamos aprendendo fatos, leis da física, não opiniões sobre as leis; as leis funcionam da mesma forma para todos, em todo o planeta. Não podes aprender com alguém que pensa que um facto é uma opinião.

  • Vamos começar do início.
    1. A relação é o critério de definição (torna a criança independente/dependente), e não o contrário.

    2. Uma relaçãoé sempre um FK na criança, do Pai. PK.

    3. Em uma relação identificando, que FK é o PK (ou a primeira parte do PK, onde o PK é uma chave composta). E a criança é uma tabeladependente .

    4. Numa relação que não identifica que FK é uma coluna não-PK, e a criança é independente (pode ser forçada a depender por alguma outra relação).

    5. Todos os subtipos têm relações de identificação do supertipo. Caso contrário, eles não seriam subtipos, seriam independentes do supertipo.

    6. Todas as relações 1:0-1 estão identificando.

então fiz o que achei que representava as coisas certas no meu modelo.

  • pode ser por isso que acabaste por adicionar [Table]Id chaves.

quando forçar (identificar) e quando ser livre (não identificar)?

  • Nunca forçar nada re modelização (base de dados e função), especialmente dados re. É o incontrolável que queremos administrar, gerir, moldar, controlar, etc. Mas para o fazermos eficazmente, temos de o compreender primeiro. Não podemos compreender nada quando o forçamos. Forçá-lo a privá-lo de se expor, e priva-nos de notar as sutilezas e sabores (porque nós "sabemos" isso). Que seja livre, mas limitada, como um cavalo num cadeado, não como um prisioneiro num estábulo.

    É por isso que o acto de colar colunas em cada a folha de cálculo impede a compreensão dos dados e, por conseguinte, qualquer modelização dos mesmos.
  • Como acima, é a relação que está identificando ou Não; Não se a entidade é independente ou não, isso é uma consequência.

Fá-lo ao estilo relacional / IDEF1X / ERwin:

  1. Se queres uma entidade, desenha uma entidade. Diz. A menos que seja a primeira entidade na tela, não adicione chaves.

  2. Agora considere o seu Relacao. Como as Entidades que você já modelou se relacionam com esta nova entidade ? Desenhe essa relação (as relações são desenhadas de pai para filho).

  3. É claro que o padrão é identificar, porque a maioria das relações em um (espere por ele) banco de dados relacional estão identificando. O PK pai é colocado no PK criança.

  4. Se achas que não, quero que isto seja independente, é bom que tenhas uma boa razão. A questão-chave aqui é: esta entidade existe completamente por si só, existe fora do contexto de outras entidades independentes ? AFAIC, há cinco no teu modelo: Endereço
    Partido
    Ponto
    Evento
    Género Todas as outras entidades existem apenas no contexto de uma dessas entidades independentes. Assim desenhastes relações identificadoras, e assim todas elas são dependentes.
    • Lembremo-nos de que tínhamos um Item como independente anteriormente; então tivemos uma nova forma de Item; que fez o Item antigo, o BandItem; que tornou o BandItem dependente do Novo Item.

    • Nós tínhamos um grande identificador em ItemId, que foi carregado não só no (então) conjunto de itens, mas ao longo, em OrderItem, revisão, etc.

    • Nós mudamos o contexto do Item (criado um Item de ordem superior), e devido às relações de identificação, que foi então migrado por todo o lado, e o novo BandItem foi migrado em seu contexto.

    • O novo ItemId continua a seria um grande identificador. BandItemId é exatamente ItemId, mas desempenha um papel particular, é um subconjunto / subtipo de ItemId.

  5. Então, se é uma entidade independente, vá em frente e dê - lhe um novo PK.
    • Mas nesta fase, não uma coluna Id, algo significativo que identifica a entidade. Event.Name, Customer.Code. Nenhum ser humano identifica um cliente como número 123456, não, eles pensam em "IBM", "3M", etc. Mais tarde, à medida que o modelo progride, faremos claro que temos chaves realmente boas; neste momento, com a nova entidade, nos importamos que ela tenha um identificador.

    • Excepção. Para Endereço, Festa, Item, você sabia que na V1.0 que você ia ter milhões, milhares, milhares deles; que estes foram os principais Identificadores que iria ser Migrado todo o banco de dados; que o verdadeiro PK foi muito longa, e que você precisava de um curto-Chave Substituta, conforme o PK; assim, você definir isso, desde o início, e você não tem mais argumento de mim.

      • Se você está pronto para domínios, então INT, INTor SMALLINT, SMALLINT.

      • Caso contrário Name, CHAR(30).

  6. O próximo passo é terminar o PK sobre a nova entidade. Se a cardinalidade do pai é 1:: n, Ele já tem o PK do Pai, basta adicionar um elemento para tornar o PK único. Vamos ver a ordem. Já tem PartId, por isso OrderNo pode estar dentro PartyId. Basta mudar a ordem das colunas PK para (1) PartyId, (2) OrderNo.

  7. A única vez que fazemos um pouco de força, é quando o número de colunas que formam o PK se torna demasiado, ou a largura total do PK se torna demasiado larga, para migrar como um FK para as crianças. Então, e só então, criamos uma chave substituta adicional do formulário [Table]Id (eles são Sempre adicional, não podemos perder o verdadeiro PK ou a singularidade, porque ele suporta outros requisitos).

    • AFAIC, that magic number is seven (magic não para muitas coisas, na verdade; mesmo este item aparece como número sete), e essa largura máxima é de 30 bytes. Isso foi feito desde o início com endereço (já altamente otimizado), Partido (caso contrário 64 bytes), Item (mais de 30 bytes).

    • Se vamos quebrar o poder relacional intrínseco, precisamos que a dor de carregar esse poder relacional em si seja realmente ruim, e por nenhuma outra razão. Nem sequer te aproximaste disso na tua modelo.

Agregado De Revisão

Fizeste um bom trabalho, por isso considera isto como a próxima progressão. Basicamente você tem duas opções, e é claro que estamos comparando/relacionando isso com o conjunto de itens.
  1. Indo com o grupo de Revisão como está. Precisamos de uma visão de Canção e de uma visão de album. E se livrar do ItemReview (que encapsula todos os itens, o que significa que estamos dobrando). Pensei que estávamos a excluir críticas para itens fora da banda.

  2. Permitir que a não-Visão de banda seja sobre qualquer Banditismo, por exemplo. muda o FK do ItemReview do Item para o BandItem. Isso encapsula todos os temas em ItemReview. Livra-te da vista performática.

      Claro, pode não querer BandItem.Outros a serem revistos; isso pode ser restringido por outros meios. Mas se você quer ser rigoroso, então você precisa (1).

Cor

É óptimo que tenhas adoptado a minha cor. esquema.
  • O Significado, a relevância visual, não aparece em um modelo minúsculo (a maioria dos meus modelos em SO); ele só aparece em modelos maiores como o seu.

  • Porque você tem feito um ótimo trabalho com V1. 3, O Professor tem um ▶maçã para ti◀. Na verdade,▶ Notação IDEF1X◀ vale a pena ler novamente o documento, está muito condensado, e disseram-me que as pessoas ganham mais valor com ele quando o lêem. depois de modelar algo. O que preciso de saber é se a hierarquia Natural e a cor fazem alguma coisa por ti.

  • Isso é só terminar o nível lógico de entidade.

Você pode continuar com o nível lógico, Chave (os únicos atributos são FKs, e nós sabemos o que eles são). Mas sinta-se à vontade para começar a identificar atributos (nesse caso, mostre o nível do atributo).

Coluna Opcional

U. 1) Facultativo Os pais voltaram para o modelo. PartyAddress is shipped for Order não é Invulável.

  • Se pretendeu modelar que o endereço de envio é opcional, então precisa de uma entidade Ordership Address, que é uma criança de ordem, e a cardinalidade é 1: 0-1.

    • as Nulls (colunas opcionais) são como um cancro que recolhe por todo o corpo, as FKs Nullable (progenitoras opcionais) são o cancro da garganta num órfão antes dos cinco anos de idade.
      .
  • Isso é o básico. método para lidar com qualquer coluna opcional, não limitado a um que é um FK (pai opcional), como aqui.

Menor

M. 11) estes estavam correctos em V1. 2
Revisão::: Comentário 1:: 0-1
Membro da banda:: Comment is 1: 0-n

M. 12) evento::a pessoa é n:: n (e as colunas não aparecerão ao nível lógico)

V1.4 e resposta

Muito bom progresso. Está satisfeito com os identificadores, as chaves ?

U. 8) (Se fizer isto primeiro, o restante seguirá facilmente.) Erwin Limitation. Parabéns, você produziu um modelo que atingiu as limitações da capacidade de ERwin na modelagem lógica. Para ser claro, este não é realmente um limite, na medida em que se resolve no modelo físico, e é claro que não é uma limitação em bases de dados IDEF1X ou relacionais. Mas agora, na lógica, interfere com a tua aprendizagem e progresso.

  • Em BandItem queremos que o PK seja, BandId). Mas ERwin não o permitirá porque diz que um subtipo PK deve ser o SUPERTYPE PK e nada mais que . Na verdade, enquanto o SUPERTYPE PK for o principal identificador, outra relação de identificação é aceitável. Para trabalhar em torno disto:
    • largue o símbolo do subtipo
    • criar dois itens identificadores de relações:: soalho e Item::BandItem
  • As relações que tivemos de fazer sem identificação podem agora ser Identificacao.

  • ERwin vai agora resolver o PKs migrado como FKs, sem duplicação.

  • Sim, manda os papéis de volta.

Agora entendo o que você está tentando fazer com o grupo de revisão, então, Primeiro, deixe-me dizer que você modelou corretamente, até a classificação.
    Mas há um problema básico na própria revisão. Com um PK de Revisor, um revisor só será permitido uma revisão. É claro, você quer uma revisão por revisor por banda/BandItem, mas isso está escondido mais abaixo no subtipo. Basicamente, o uso do subtipo-supertipo aqui é muito restritivo. É bom entender, nessa fase inicial, mas agora temos de ir mais além.
    • em vez do grupo de revisão, crie duas tabelas de Revisão, uma revisão de banda e uma revisão de Item.
    • as relações serão pessoais:: visão de banda e Banda::visão de banda, e pessoa::visão de banda e BandItem: visão de banda
    • então cada um de eles terão classificação de crianças %, % comentário, %Comentração.

M. 13) ordem: Ordership address is 1: 0-1, correct. Endereço::: Ordem 1:: 0-n, correcto Por conseguinte, o endereço de envio deve ser em PartyAddress:: OrderShipAddress 1:: 0-n

M. 14) O Pagamento permite actualmente apenas um pagamento por ordem, que pode ser o que necessita, mas a relação é 1::1-n. Se necessitar de mais, adicione então um SequenceNo ao PK.

O género é bom. Mas o subgênero precisa algo no PK para permitir mais de um género. Eu mudaria agora Genre.Name ao género.Gênero, e adicionar subgênero ao subgênero PK. - isso vai resolver o evento.O GenreId também. O local precisa de um nome para um PK por agora. Se você estiver pronto para chaves melhores, então ShortName, e o nome se move para baixo como um atributo. A Confirmar. Uma vez que temos uma relação de identificação em ordem, e o PK (PartyId, OrderNo) portanto OrderNo é um número sequencial dentro do PartyId, correto ?

Go for V1.5. Incluir alguns atributos. A melhor maneira de identificá-los é iniciar um modelo de função (e agora trabalhar o modelo de Dados lado a lado com ele) ou, pelo menos, trabalhar através de todas as funções para todas as telas.

Saúde.
 3
Author: PerformanceDBA, 2017-05-23 11:48:23