2011-12-06 20 views
5

Mod'a Not: Bu konuyla ilgili görünen bir düzine yazı okudum, ancak hiçbiri sorumu yanıtlamadı. Lütfen bu yayının silinmesi için işaretlemeyin; Bu yinelenen bir soru değil.MySQL, çoktan çoğa bağlantı tablosu için birincil anahtar gerektiriyor mu?

Çoktan çoğa ilişkiler içerecek bir web galerisi için veritabanı yapıyorum. Örneğin, etiketler ve resimler. Açıkçası, bu üçüncüsünü başarmak için, link, tablo oluşturulacak. Etiketler tablosunda ve resim tablosunda bir birincil anahtar sütunu kullanmak için bir kullanım görebiliyorum, ancak bağlantılar tablosunda bunun için bir kullanım hayal edemiyorum. Sadece sunucu alanını kaplardı. Bu yüzden, bağlantılar tablosunda sadece birincil anahtar sütun olmamayı düşünüyorum. MySQL buna izin veriyor mu? Ya da, bağlantılar tablosunda birincil anahtar olması için herhangi bir zorlayıcı sebep olur mu? Teşekkürler.

Bağlantı Tablo:

+--------------+---------+-----------+ 
| primary key? | tag ids | image ids | 
+--------------+---------+-----------+ 

Açıklama

Will bir tabloda birincil anahtar veritabanı kırmak olmaması?

+0

Birincil anahtar _required_? Hayır. Neredeyse her zaman bir aday var mı? Evet. Dizinsiz bir tablo kullanabilirsiniz, ancak bu hız için harika bir yaklaşım değildir. :-) – Wiseguy

cevap

6

Bağlantı tablosunda birincil anahtara gerek yoktur. Bir bileşik anahtar iyi bir fikir olsa da. Benzersizlik, UNIQUE (tag_ids, image_ids)

+1

A 'UNIQUE 'anahtarı, esas olarak bu durumda bir" PRIMARY "anahtarı ile aynıdır. http://stackoverflow.com/questions/158392/primary-key-versus-unique-constraint – ceejayoz

+0

@ceejayoz - karmaşık bir tabloda birden fazla benzersiz kısıtlamaya sahip olmanız gereken nokta. Ve bu birincil anahtar zorunlu değildir. Ancak, evet, bu durumda birincil anahtar olarak benzersiz davranacaktır. –

5

Evet, birincil anahtarınız tag_id ve image_id, yani PRIMARY KEY (tag_id, image_id) birleşik/bileşik anahtar olmalıdır. Bu durumda ekstra bir otomatik değiştirme sütuna gerek yoktur.

+0

Bileşik/bileşik benim için yeni bir terimdir. Yani 'tag_id = 23' ve 'image_id = 54 'ise' linke_id' (birincil anahtar) 2354 olmalı? Birincil anahtar sütununun avantajı nedir? –

+0

Bu durumda birincil anahtar, aynı etiketin birden çok kez eklenmesini engelleyecek ve verilerin tablodan alınmasını hızlandıracak. – ceejayoz

+0

Teşekkürler, bu çok yardımcı oluyor. –

8

kullanılarak sağlanabilir. Birincil anahtara sahip olmanız gerekmez. Bununla birlikte, bir birincil anahtarın sadece bir alan olması gereği yoktur. Bu durumda birincil anahtarınızı (tag_id, image_id) olarak bildirebilirsiniz.

Bana, birincil anahtarı yapmak için iki alanı birleştirmeniz gerektiğini düşündüğünüz fikrini veren başka bir gönderiye yanıt olarak bir sorunuz var. Yapma.

alter table link add primary key (tag_id + image_id); 

(Bence söylemek Do NOT

alter table link add primary key (tag_id, image_id); 

olarak anahtar tanımla "+" MySQL birleştirme operatörüdür. Bu bir süre oldu. SQL standardı "&" ama MySQL kullanan ikinci durumda her ikisi de 2534.

dönüştü ederken başka bir şey için.)

ikisi arasında büyük fark vardır, yani birinci durumda, 25,34 ve 253,4 iki farklı değerleri vardır

Her zaman etiketten resme gider misiniz, yoksa resimden de etikete mi gitmek istiyorsunuz? Her iki yönde de gitmeniz gerekirse, iki alandaki alanları içeren iki dizin veya birincil anahtar ve dizin oluşturmanız gerekir.Gibi:

create index link_tag_image on link(tag_id, image_id); 
create index link_image_tag on link(image_id, tag_id); 

sadece ilk (örneğin), o zaman dikkate bu sorgu yaparsanız: Bu plausbile yeterli görünüyor

select tag.name 
from image 
join link on image.image_id=link.imagae_id 
join tag on tag.tag_id=link.tag_id 
where image.foo='bar' 

: Belirli bir koşulu karşılayan görüntüleri eşleşen tüm etiketler bulabilirsiniz. Ancak, ikinci indeks olmadan, bu sorgu çok uzun zaman alabilir, çünkü db, tüm kayıtların belirli bir image_id ile tüm kayıtları bulmak için sırayla tüm bağlantı tablosunu okumak zorunda kalacaktır.

0

MySQL Workbench ile çalışırken, birincil anahtar olmadan tablolarınıza yalnızca okuma dışında bir şekilde erişime izin vermeyeceği için veritabanınızı test etmeye çalışırken bir rahatsızlık vermesi çok tavsiye edilir. Her ne kadar bir ilişkide referans olarak görülmeyecek bir PK'ye sahip olmak israfa sürüklüyorsa da.

İlgili konular