2010-03-06 43 views
5

SQL Server 2005'te 2 alana gereksinim duyan yeni bir tablo oluşturuyorum: DateTime ve MyValue (Int32). DateTime alanı benzersiz olacak, böylece benzersiz bir kısıtlama ayarlayacağım.datetime alanında SQL Server birincil anahtarı

Hangi tablo yapısı daha iyidir ve neden?

MyIndex (PK, int)
MyDate (tarih saat) (IX_UniqueKey)
MyValue (int)

veya

MyDate (PK, tarih saat)
MyValue (int)

Benim hislerim bu tabloda yapay bir PK (MyIndex) istemiyorum çünkü gereksizdir ve tarihler benzersiz olacak çünkü herhangi bir kayda erişmek için onları kullanacağım. Bununla birlikte, yapay bir PK'ye sahip olmak daha ... ... daha iyi olabilir mi?

+0

Şahsen MyDate, MyIndex, MyValue vb. Kullanmazdım. "My" öneki ne ekler?Neden EventDate veya EventDateTime ve [Value] veya EventValue değil? Ayrıca, tarih değerleri benzersiz olacaksa, çözünürlüğün saat veya gün olduğunu varsayacağım. Eğer öyleyse, DATETIME'den daha küçük SMALLDATETIME kullanarak daha iyi. –

+2

@Aaron Bertrand, bunun sadece bir örnek olduğunu ve DATETIME saniyenin/milisaniyenin olabileceğini düşünüyorum. –

+0

Doğru - bu, gerçek tablonun ne olacağının bir özetidir. – Guy

cevap

9

Tarihler benzersiz olacak derken, sizce düşünür müsünüz, ya da benzersizliği, sorunun ifadesiyle garanti ediliyor mu? Benim tecrübelerime göre, bazı şeyler, hayal edenden daha az benzersiz bir anlaşma olarak ortaya çıkıyor (ABD sosyal güvenlik numaraları bir örnek).

Tarih değerleri benzersiz değilse, tamsayı anahtarını eklemelisiniz.

Tarih değerleri benzersiz olarak garanti edilirse, bunlar değişir mi? Değişiklik yaparlarsa, başka tablolar tarafından başvuruda bulundular mı? Her iki cevap da "evet" ise, muhtemelen tamsayı anahtarını eklemelisiniz.

Tarih değerleri benzersiz olarak garanti edilir ve değiştirilmez veya başvuruda bulunmazsanız, bunları anahtar için kullanabilirsiniz. Normal DATETIME'ler 8 bayttır ve standart INTEGER değerleri, indeksleme üzerinde küçük bir etkisi olabilecek 4 bayttır. Tarih değerleriniz yalnızca tarihlerse veya yalnızca dakika ya da daha azsa ve türün izin verdiği daha sınırlı aralıkta SMALLDATETIME kullanabilir ve bu dizin değerlerini 4 bayta indirebilirsin.

+0

Tarih alanı, günlük olarak saklama bilgileri olarak benzersizdir. Örneğin, bir milli parka günlük ziyaretçiler. Dolayısıyla, o günkü ziyaretçi sayısını ölçen her gün için sadece bir kayıt olacak. Bulunduğunuz noktaya göre küçük zaman, bu alan için daha iyi bir veri türü gibi geliyor çünkü zamanın önemi yok. – Guy

1

Hayır, sezginiz doğrudur. Hiç kimse iki (veya daha fazla) eşzamanlı olayı kaybolabildiği sürece, veri toplama işleminizin mevcut çözünürlüğünü göz önünde bulundurarak, sizi aldatıcı bir dory.

1

Tarihin her zaman benzersiz olacağını (zaman bileşeninin çözünürlüğünü düşünün) garanti ederseniz, datetime sütununda Birincil anahtarın oluşturulması iyi bir seçimdir.

Yalnızca daha fazla veri eklemek istiyorsanız, ana anahtar sütununuzdaki kümelenmiş dizini oluşturmak da iyi bir seçimdir. DATETIME değeri veritabanı IE tarafından doldurulur ise

2

:

INSERT INTO your_table 
    (mydate, myvalue) 
VALUES 
    (GETDATE(), 1234) 

... o zaman evet, mydate sütun birincil anahtar yaparak ideal bir çözümdür. tarih uygulaması IE tarafından sağlanıyorsa:

INSERT INTO your_table 
    (mydate, myvalue) 
VALUES 
    (@my_date_value, 1234) 

... @my_date_value varsayarak veritabanı tarafından besleniyor değil - hayır, ideal değil. Veritabanından başka herhangi bir şeyden bir tarihin, yerleştirmeye bağlı olarak doğru olması garanti edilemez.

İlgili konular