Negatif anahtarlar ne için kullanılır?


12

Standart SQL veritabanlarını kullanmak için biraz yeni (şu anda çoğunlukla MySQL ile çalışıyorum) Henüz bu kadar çok kullanımla karşılaşmadım.

Bir tabloyu dizine eklerken negatif (veya daha çok imzalı) anahtarlara sahip olmak ne zaman ve neden yararlıdır?


5
ilk olarak, geri bildirim bırakmadan kim oy veriyorsa, bir kötülük yapıyorsunuz. Sıradaki, bu mükemmel sorunun cevabı.
jcolebrand

1
Bu konu ilgi çekicidir. Bu konsepti şahsen hiç duymadım. Bu sorunun asla reddedilmemesi gerekirdi. Bu konsepti tanıttığım için benden +1.
RolandoMySQLDBA

Yanıtlar:


13

Birincil anahtarın tümü, bir kayıtta son derece önemli olan değer olduğunu belirlediğimiz bir değerdir. Bu anahtar imzalı bir int, imzasız bir int, bir dize, bir damla (aslında sınırlar vardır) veya bir UUID (veya bugün aldığı herhangi bir ad) olsun, gerçek hala bir anahtar olduğunu ve çok önemli bir şey.

Anahtarlarımız için yalnızca pozitif odaklı sayılar kullanmakla sınırlı olmadığımız için, imzalı bir int'in sadece ~ 2 milyar, imzasız bir int'in ise ~ 4 milyar olacağını düşünmek mantıklıdır. Ancak, imzalı bir int kullanmanın, başlangıç ​​değerini ~ -2 milyar olarak ayarlamanın ve bir artış artırmanın yanlış bir yanı yok. ~ 2 milyar kayıttan sonra "sıfır" a basacaksınız ve sonra ~ 2 milyar'a devam edeceksiniz.

Bir tabloda "negatif anahtarların" olmasının neden yararlı olacağına gelince, bu, "bir tabloda anahtarların bulunması neden yararlıdır" sorusuyla aynı sorudur. Bir anahtarın "değerinin" anahtar olarak durumu üzerinde hiçbir etkisi yoktur. Anahtar anahtardır anahtardır.

Önemli olan anahtarın geçerli olup olmadığıdır.

Negatif anahtarlara izin vermenin neden yararlı olduğuna gelince, bazı nedenler önerebilirim:

Bir satış sistemindeki getirileri, pozitif müşteri siparişi numarasıyla eşleşen negatif satış siparişi sayıları olarak belirtmek isteseniz, korelasyonu kolaylaştırır (bu naif ve kötü tasarlanmış, ancak "elektronik tablo" anlamında çalışır).

Bir kullanıcı tablosuna sahip olmak ve negatif sayıya sahip olanların sistem kontrollü olduğunu belirtmek isterseniz (SO, sohbet yayını kullanıcıları için bunu çok yapar).

Devam edebilirdim, ama gerçekten negatif sayının öneminin tek nedeni, siz veya ben buna önem vermenizdir. Bunun yanı sıra, bir anahtarın değerinin anahtar üzerinde herhangi bir etkisi olması için büyük bir neden yoktur.


Deneyimsizlik nedeniyle büyük olasılıkla bir yanlış anlama olduğundan, 'niş oluşumu' bit düzenlenmiştir. İlginç bir okuma. Anahtarın negatif değerinin kodlamada bir şekilde yararlı olduğu bir durum olacağını hayal ediyordum (i, e, belirli bir şey anlamına gelmeden karar vermeden), ancak bu, iki gruba ve don'a güçlü bir bölünme olduğunda çok yararlı bir düşünce. fazladan bir bool kullanmak istemiyorum: p
Garet Claborn

1
@Garet ~ Yani iyi bir noktaya değinmek: "anahtarın değeri kodlama bir şekilde yararlı oldu" ve ben zaman zaman anahtarlarımı sadece bu şekilde kullanmak, ama veritabanı yönü ile ilgisi yoktur. Veritabanı bir depo. Verileri tüketen uygulama ise değerleri önemsiyor . Ama evet, bu +/- boolean düzgün bir hile, sadece böyle bir etki için birçok zaman kullandığını gördüm.
jcolebrand

2
Bunun gibi çift amaçlı değerlerin kötü bir fikirden başka bir şey olduğunu ima etmek için -1. Bir int ve bir boole mı ihtiyacınız var? Bir int ve bir bool kullanın.
Jack diyor ki topanswers.xyz

1
@JackPDouglas İnsanları bunu yapmaya teşvik ettiğimi hatırlamıyorum, alanın ve verilerinin iki farklı şey olduğunu ima ettiğimi kesinlikle hatırlıyorum. En azından aşağı oyunuzda yapıcı geri bildirim sunduğunuz için teşekkür ederiz, ancak gözlemin, bir veritabanı katmanı sorunu değil, bir uygulama mantığı sorunu olduğu için "kullanılan negatif anahtarlar nedir" kavramı ışığında bir şey ifade ettiğini söyleyemem. . Bunların uygulama katmanında nasıl kullanıldığını vurgulamak istedim, ancak veritabanı katmanında herhangi bir önemi yok.
jcolebrand

1
@JackPDouglas ~ Bu örneği kullandım çünkü duymuş olabileceğiniz çok iyi bilinen bir site (site ağı) var, bu yüzden bunu reddetmek istemiyorum, çünkü geçerli "hile". Bu kullanıcıyı kontrol et dba.stackexchange.com/users/-1/community ve bana kimliğinin ne olduğunu söyle. Kullanıcı kimliğinin birincil (ve diğer birçok tabloda yabancı) anahtar olduğundan neredeyse emin olabilirim. Bunun sizin için kötü bir uygulama tasarımı olması, geçerli olmadığı anlamına gelmez. Ama bir kez daha, bu db tasarımı değil, alan tasarımı. Verilmiş, db mantığı destekliyor
jcolebrand

10

Kimlik veya otomatik sayı sütunları üzerindeyse, değerin kendisinin bir anlamı olmamalıdır. (Bazen, SO'nun kendimden önce yaptığım drachenstern tarafından konuşulan sohbet kullanıcılarına göre)

Ancak, imzalı tamsayılar kullanırsanız genellikle aralığınızın yarısını kaybedersiniz.
Bkz: Tablodaki bir alan, imzalı veya imzasız maksimum 32 bit tam sayıya yaklaştığında ne yapmalı?

Başka bir örnek: Küçük çoğaltma senaryolarında, bir site için negatif değerler ve başka bir site için pozitif değerler kullanmak, verilen herhangi bir satırın kaynağı hakkında örtük bilgi verir.


ve her sitede girilen değerleri bir şekilde kısıtladığınızdan emin olun, aksi takdirde “örtük bilginiz” yanlış olduğu zaman korkunç bir karmaşaya girersiniz.
Jack diyor ki topanswers.xyz

@JackPDouglas: Yanlış sitede değer üretmemek için NOT REPLICATION kullanmazsınız
gbn

kontrol kısıtlamaları ile birlikte ? Ayrıca, NOT FOR REPLICATIONbildiğiniz bir MySQL (veya başka) analogu var mı?
Jack diyor ki topanswers.xyz

@JackPDouglas: üzgünüm, olmayan SQL Server hakkında emin değilim
gbn

8

Tüm veritabanı sistemleri imzasız tamsayı türlerini bile desteklemez, MSSQL desteklemeyenlerden biridir. Bu durumlarda, tamsayı anahtar alanlarında negatif değerler mümkündür çünkü bunlar türde mümkündür ( bu örnekte gösterildiği gibi, bunları engellemek için kuralları veya tetikleyicileri kullanabilirsiniz) , ancak muhtemelen bu tür kuralların uygulanmasına ilişkin ek yükü eklemenize gerek yoktur. her inters / update).

Veritabanı ile ilgili olarak, birincil anahtarın gerçek değeri tablo içinde benzersiz olduğu sürece önemli değildir. Buna göre -42 ve 42 aynı şekilde 42 ve 69 olmak üzere iki farklı sayıdır - anlam sadece kodunuzun değerinin olumsuzluğuna veya değerine aktarılacaktır.

İmzasız tam sayı türlerini desteklememek muhtemelen karmaşıklığı azaltmaya dayalı bir tasarım kararıdır - yani aralarında değerler atarken aralıkları kontrol etme konusunda endişelenmek için iki farklı 32 bit tam sayı türü istememek. İmzalanmamış bir türde (~ 4e9 yerine ~ 2e9) mümkün olanın 0 veya 1 ila yarısını başlatan bir otomatik artış alanında mümkün olan dizin sayısını sınırlandırır, ancak bu nadiren önemli bir sorundur (ihtiyacınız varsa özellikle de bu tür değerlerin 32-bit olanlardan daha az verimli bir şekilde işlenmediği bir 64-bit mimari kullanıyorsanız, yine de muhtemelen 64-bit tip için gittiğiniz o büyüklükteki bir dizi anahtar değer) alan nedenleriyle 32 bit'e yapışmak için artışı -2.147.483.647'den başlatabilirsiniz.


Evet, sanırım daha önce bu alanı ele aldık;) tehehe dba.stackexchange.com/questions/983/…
jcolebrand

tinyint imzasızdır (0 .. 255). Ben genellikle kaçınılmaz olarak örtük olarak varsayılır kod yazılır ve bir şekilde negatif bir değer sürünürse garip hatalar ortaya çıkacağından, değerlerin negatif olmadığından emin olmak için tamsayı sütunları üzerinde bir kontrol kısıtlaması oluştururum.
Ed Avis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.