2012-08-02 26 views
6

Bir school.Here öğrencilerin bir veritabanı ben bugüne kadar ne olduğunu ve diyorum enter image description hereBileşik bir anahtar nasıl benzersiz olunur?

siz "Kısacası" kısmına

sorun için atlamayı okuma beğenmezseniz Bu tasarımdan memnun değilim. Ben grade, subgrade ve id_class kombinasyonu benzersiz olması ve öğrencilerin tablo için birincil anahtar olarak hizmet etmek istiyorum. student_id'u kaldırabilir ve 3'ten bir bileşik anahtar oluşturabilirim ama bunu istemiyorum. Belki başka tablo combination_id nerede grade, subgrade ve id_class yabancı anahtarları ve tablo için kimlik işlevi görür bir ilave sütun comb_id var diyelim yapmalıdır. Ve tüm sütunlar Birincil Anahtarlar olacaktır. Ancak sorun şu 3 sütun bu ekstra sütun nedeniyle tekrarlayabilmesidir (comb_id). Mesela ben çünkü masanın (combination_id) 4 sütun kompozit anahtarın satır geçerli hale getirecek aynı grade, subgrade ve class_id ancak farklı comb_id sahip olabilir. Kısacası

Ben tablonun yalnızca birincil anahtar kalması ama bir türlü grades, subgrade ve class_id eşsiz kombinasyonu olan başka bir tabloya yabancı anahtar olarak students_id istiyorum. Ben açık değilse

yeterli aşağıdaki yorum sorabilir ve şimdiden teşekkür ederim.

PS Ben indescriptive başlık için üzgünüm ama

Edit 1 adlandırma kötüyüm: subgrade bir olabilir 1 olabilir: daha net olmak gerekirse j id_class 1'den 30'a kadar olabilir ve Yani bir öğrenci 7b sınıftan olabilir ve sınıfın

daki sayıdır sınıfta onun numarası - 5

+0

Anlayamıyorum, sınıfta garaunteed dersi alan öğrenciler var mıdır? – Jodrell

+0

Öğrenciler dersi değiştirdiğinde ne yapacaksınız yoksa bu hiç olmuyor mu? – Jodrell

+0

Bir "student_id" sütunundaki sorun nedir? – Jodrell

cevap

17

benzersiz tuşları ve birincil anahtarlar kavramlarını karıştırmayın. Çok iyi üç sütun grades, subgrade ve class_id kapsayan unique key ekleyebilir. Bu şekilde, iki satır could have bu üç sütun için aynı değerleri içermez. Bu üçü bileşik bir ana anahtar olarak kullanmak istemediğinizi yazarken, birleşik benzersiz ek anahtarın daha iyi olacağından emin değilim. Aksi halde, bileşik anahtarların kabul edilebilir olduğunu netleştirmeniz gerekir.

benzersiz bir anahtar oluşturmak için aşağıdaki SQL statement kullanabilirsiniz:

ALTER TABLE students ADD UNIQUE gsc (grades, subgrade, class_id); 

kelime gsc Ben anahtar sütunlarının baş harflerini oluşan sadece bir isim var; İstediğiniz adı kullanın, bazı EXPLAIN çıkışındaki veya benzeri anahtardaki anahtarı tanımlamak istemediğiniz sürece, önemli değildir.

+0

teşekkürler bunu deneyeceğim ve muhtemelen insanları “grade”, “subgrade” ve “id_class” adlarıyla karıştırdım, fakat ülkemde eğitim sistemi farklı. – Bosak

+0

Tamam Bunu denedim ama 3 sütunu “UNIQUE” yaptığımda yinelenen girişler için bir hata aldım. Çok fazla 3 notum vardı, fakat farklı "altyazılar" vardı, bu yüzden onları ayrı "benzersiz" anahtarlar olarak ele aldılar. Ayrıca ek nedir? – Bosak

+0

Tüm thre sütunlarını tek başlarına yaratma, ama birlikte: "ALTER TABLE öğrencileri UNCQ gsc (notları, alt sınıf, class_id)" yi ekliyor. 'gsc' sadece bir isim, ne istersen onu kullan. Daha sonra kopyalar sadece üçü aynıysa oluşur. * * * * Teriminin aksine * tamamlayıcı * terimini kullandım: Bu komut kullanılarak tanımlanan bir anahtar birincil değil, yine de benzersizdir. – MvG

2

Ben size tarif ne istiyor neden tamamen açık değilim, ama ben şu şekilde modeline bakmak istiyoruz ...

You have öğrenciler
- Onlar farklı kuruluşlar, başka kurumların değil bir karışımı olan
- Kendi özellikleri vardır; vs adı, doğum tarihi,

Derslere
var - Bu öğrencilerin
gruplarıdır - aynı "sınıf" İçinde farklı öğrencisi vardır Her accademic yıl
- Onlar da kendi özellikleri vardır; sınıf, alt sınıf, vb

Bilirsin normal
kullanmak ister Modelinizdeki fazladan özelliği vardır - bir sınıf her biri 20

1'den ikincil kimliği ile özdeşleşmiş 20 öğrenci, varsa


Bu beni aşağıdaki Boyut tabloları

Student     Class      Grade    SubGrade 
----------------------- ------------------------ ----------------- ----------------- 
id   INT PK  id   INT PK  id INT PK  id INT PK 
first_name VARCHAR(45) name   VARCHAR(45) name VARCHAR(45) name VARCHAR(45) 
last_name VARCHAR(45) grade_id  INT FK  desc VARCHAR(45) desc VARCHAR(45) 
etc, etc     subgrade_id INT FK  etc, etc   etc, etc 

Class masasi verecekti (grade_id, subgrade_id) üzerinde benzersiz bir kısıtlama olabilir, böylece sadece bir sınıf 7b olabilir. Bir öğrenci sadece hiç herhangi öğretim yılında bir sınıfta olması gerekiyorsa

Sonra bir durum tablosunu kullanarak sınıflarına öğrencileri ilişkilendirmek gerekiyor ...

Class_Membership 
----------------------- 
id    INT PK 
student_id  INT FK 
class_id   INT FK 
academic_year INT 

, üzerinde benzersiz kısıtlama koyardı (student_id, academic_year).

Alternatif olarak, Class tabloda akademik yıl olabilir. (örneğin, o yıl daha az öğrenci var gibi) Bu her yıl için tekrarlanan aynı sınıf var, ama bu bazı yıllarda sınıf 7golmayabilir anlamına gelir.

Aynı şekilde, 7b den 7c yıl ortasına taşımak öğrencileri olabilir. Hangi durumda Class_Membership tablo start_date alan ve muhtemelen bir end_date alanı olabilir. Bunun


Yok Ancak, doğrudan (20 öğrencisi olan bir sınıf için 1-20) id_class alanını yaratır. Şahsen ben böyle bir alan, aynı işlevselliği çoğunu hizmet edebilir Class_Membership tablodan id alan ve muhtemelen ek özelliğe sahip olmazdı. o gerekli olduğunda, bununla birlikte, sadece

Class_Membership ----------------------- id INT PK student_id INT FK class_id INT FK academic_year INT class_member_id INT 

Sonra da (academic_year, class_id, class_member_id) üzerinde benzersiz bir kısıtlama olabilir ... Class_Membership tabloya ekleyebilirsiniz.


kesin gerçek dünya-modeline ve belirli ihtiyaçlarına bağlı olarak, burada esneklik oldukça çok şey var.Ama umarım bu örnek sizin için iyi bir başlangıçtır; Varlıkları listeleyen boyut tabloları ve bu varlıkları bir araya getiren ve/veya Varlıkları açıklayan bir Gerçek Tablo (veya Tablo).

+1

Şemayı olduğu gibi sorguladığınızda, düşüncelerimi buraya ekleyeceğim. @Bosak, benim anlayışım gereği, “alt sınıf” sadece aynı sınıftaki farklı sınıfları ayırt eden bir harftir. Bu nedenle, sınıf ve alt sınıf bir sınıfı tanımlarken, kendi başına bir alt sınıf gerçekten bir varlık değildir. Nadiren “alt sınıf b ile tüm sınıflar” ile ilgilenirsiniz ve tüm bu sınıflar için ortak özniteliklerin depolanmasıyla daha da ilgilenmeyeceksiniz, b? Bu durumda, SubGrade tablosunu düşürürdüm. – MvG

0
alter table <TableName> add constraint <ConstraintName> unique(<col1>, <col2>) 

Modified the answer due to syntax mistakes. Mentioned above is correct.