Pergunta

Estou bastante confuso com a dor de fautor aqui .

Eu sei como fazê-las, veja abaixo, mas nenhuma idéia porque? Para que servem?

create table orders (order_no int not null auto_increment, FK_cust_no int not null, 
foreign key(FK_cust_no) references customer(cust_no), primary key(order_no)) type=InnoDB;


create table orders (order_no int not null auto_increment, FK_cust_no int not null, 
foreign key(FK_cust_no) references customer(cust_no), primary key(order_no));
Foi útil?

Solução

InnoDB é um href="http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html" rel="noreferrer"> mecanismo de armazenamento . Há muito poucos deles, e todos eles têm seus prós e contras. maiores forças do InnoDB são:

  • Suporte para transações (o que lhe dá suporte para a ACID propriedade).
  • bloqueio de linha de nível. Ter um mais de granulação fina bloqueio mecanismo dá-lhe maior concorrência em comparação com, por exemplo, MyISAM .
  • Restrições de chave estrangeira. O que lhe permite deixar o banco de dados de garantir a integridade do estado do banco de dados, e as relações entre tabelas.

Outras dicas

Sempre. A menos que você precisa para usar a pesquisa de texto completo do MySQL ou InnoDB está desabilitado no seu serviço de hospedagem compartilhada.

Eu acho que você está confuso sobre duas questões diferentes, quando usar InnoDB em vez de MyISAM, e quando usar chave estrangeira (FK) restrições.

Quanto à primeira questão, tem havido muitas respostas que fazem um grande trabalho de explicar as diferenças entre MyISAM e InnoDB. Eu só vou reiterar que, na citação de tvanfosson de um artigo, MyISAM é mais adequado para o sistema com principalmente lê. Isso é porque ele usa nível de tabela de bloqueio em vez de nível de linha, como InnoDB, então MyISAM não pode lidar com alta concorrência, bem como, além de suas características falta que ajuda com a integridade dos dados, tais como transações e chaves estrangeiras (mais uma vez, já mencionadas por outros).

Você não tem que usar restrições FK em seu modelo de dados. Se você sabe o que as relações entre as tabelas é, e sua aplicação é livre de erros, então você vai passar sem FKs muito bem. No entanto, usando FKs dá-lhe um seguro extra na camada de banco de dados porque então o MySQL não vai deixar sua aplicação inserir dados errados com base nas restrições que você criou.

No caso de você não está claro sobre o porquê de usar chaves primárias (PK), fazendo uma coluna, como id_order por exemplo, a PK dos meios de mesa orders que o MySQL não vai deixar você INSERT o mesmo valor de id_order mais de uma vez porque cada linha em uma coluna PK deve ser exclusivo.

Um FK seria usado em uma tabela, que tem uma dependência de outra mesa, por exemplo, order_items teria uma dependência em orders (abaixo). id_order_items é a PK de order_items e você poderia fazer id_order_items o FK da tabela de orders para estabelecer um relacionamento um-para-muitos entre orders e order_items. Do mesmo modo, poderia ser um id_item FK na tabela order_items e uma PK na tabela items para estabelecer uma relação de um-para-muitos entre order_items e items.

** Então, o que a restrição FK faz é impedir que você adicionar um id_item value to theorder_itemstable that isn't in theitemstable, or from adding aid_order_itemstoordersthat isn't in theorder_items `tabela.

Tudo o que um FK faz é garantir a integridade dos dados, e também ajuda a transmitir as relações entre as tabelas para outros desenvolvedores que não escrevi o sistema (e você mesmo meses mais tarde, quando você esquece!), Mas, principalmente, é para a integridade dos dados. * *

de crédito Extra:?. Então, por que as operações de uso Bem, você já mencionou uma citação que diz que eles são úteis para o sistema bancário, mas eles são úteis na forma mais situações do que

Basicamente, em um banco de dados relacional, especialmente se for normalizada , uma operação de rotina, tais como adicionando uma ordem, atualizando uma ordem, ou exclusão de uma ordem frequentemente toca mais de 1 mesa e / ou envolve mais de uma instrução SQL. Você poderia até mesmo acabar tocando a mesma tabela várias vezes (como o exemplo a seguir faz). BTW Data Manipulation Language (DML) (INSERT / UPDATE / DELETE) envolvem apenas uma mesa ao mesmo tempo.

Um exemplo de adição de uma ordem:

Eu recomendo uma tabela orders e uma mesa order_items. Isso faz com que pode você pode ter uma PK na id_order na tabela de orders, que id_order meios não pode ser repetido em orders. Sem a orders 1-para-muitos - relação order_items, você teria que ter várias linhas na tabela orders para cada ordem que tinha vários itens associados (você precisa de uma tabela items também para este sistema de e-commerce btw). Este exemplo está indo para adicionar uma ordem e tocar 2 mesas ao fazê-lo com 4 generac diferentedeclarações odicetagcode.

(sem restrições de chave para fins de ilustração)

-- insert #1
INSERT INTO orders (id_order, id_order_items, id_customer)
VALUES (100, 150, 1)

-- insert #2
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 1)

-- insert #3
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 2)

-- insert #4
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 3)

Assim que se o Inserir nº 1 e Inserir nº 2 consultas executar com êxito, mas o Inserir nº 3 declaração não fez? Você iria acabar com uma ordem que estava faltando um item, e que seria de dados de lixo. Se, nesse caso, você quer reverter todas as consultas para o banco de dados está no mesmo estado em que estava antes de adicionando a ordem e, em seguida, começar de novo, bem, isso é exatamente o que as transações são para. ** É consultas agrupar que você quer quer todos eles feito, ou em caso de uma exceção, então nenhum, em uma transação.

Assim como restrições PK / FK, transações ajudar a garantir a integridade dos dados. **

InnoDB:

O mecanismo de armazenamento InnoDB no MySQL. InnoDB é um mecanismo de armazenamento de alta confiabilidade e de alto desempenho para MySQL. Principais vantagens do InnoDB incluem:

  • Seu design segue o modelo ACID, com transações apresentando commit, rollback, e capacidades de crash-de recuperação para os dados do usuário proteger.
  • bloqueio de nível de linha (sem escalonamento para fechaduras mais grossa granularidade) e Oracle-estilo consistente lê aumentar a simultaneidade multi-usuário e desempenho.
  • tabelas InnoDB organizar seus dados em disco para otimizar as consultas comuns com base em chaves primárias. Cada tabela InnoDB tem um índice de chave primária chamada de índice de cluster que organiza os dados para minimizar I / O para pesquisas de chave primária
  • Para manter a integridade dos dados, o InnoDB também suporta FOREIGN KEY restrições de integridade referencial.
  • Você pode misturar livremente tabelas InnoDB com tabelas de outros mecanismos de armazenamento MySQL, mesmo dentro da mesma instrução. Por exemplo, você pode usar uma operação de junção para combinar dados de InnoDB e tabelas de memória em uma única consulta.

InnoDB Limitações:

  • No indexação de texto completo (Abaixo-5,6 versão mysql)

  • Não pode ser comprimido para rápido, só de leitura

Detalhes:

Consulte este ligação

No seu exemplo, você cria as chaves estrangeiras. As chaves estrangeiras são suportados apenas para tabelas InnoDB, não para tabelas MyISAM.

Você pode estar interessado em este artigo do banco de dados Journal que discute o tipo de tabela InnoDB no MySQL.

Trecho:

No mês passado, olhou para a mesa de MONTÃO tipo, um tipo de tabela que corre inteiramente em memória. Este mês nós olhamos configurar o tipo de tabela InnoDB, o tipo de maior interesse para os graves Comercial. O tipo padrão MyISAM é ideal para o uso do site, onde há são muitas leituras em comparação com escreve, e nenhuma transação. Onde estas condições não se aplicam (e além de sites, eles não se aplicam muitas vezes no mundo do banco de dados), o tabela InnoDB é provável que seja a mesa tipo de escolha. Este artigo tem como objetivo a usuários que estão familiarizados com MySQL, mas só tenho usado o MyISAM padrão tipo de tabela.

Eu não ser adiadas pela outra pergunta. Manter backups apropriados de seu banco de dados, de qualquer tipo - e não deixe cair tabelas por acidente ;-) -. E você estará ok qualquer tipo de tabela que você escolher

Em todos os lugares! myisam deprecate, InnoDB é o caminho a percorrer. Não é apenas sobre o desempenho, mas a integridade dos dados e transações de ácido.

Em geral, para mim o ponto mais importante é que ofertas InnoDB por bloqueio de linha, enquanto MyISAM parece por tabela. Em grandes mesas com um monte de gravações isto pode fazer uma questão de grande desempenho.

Na tabela MyISAM otherhand tem uma estrutura de arquivos mais fácil, copiar e reparação de mesa em nível de arquivo é mais fácil caminho.

Um comentário tem um comando para converter seus bancos de dados para o InnoDB aqui.

Um suplemento para knoopx 's resposta sobre transações:

O padrão do MySQL tipo de tabela, MyISAM, não suporta transações. BerkeleyDB e InnoDB são os tipos de tabela de transação-safe disponível em MySQL de código aberto, versão 3.23.34 e maior.

A definição da transação e um exemplo bancário

Uma transação é uma seqüência de operações de banco de dados individual que são agrupados. -- Um bem exemplo, onde as transações são úteis é no setor bancário.

Fonte do citações

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