Bir vekil anahtar bir kullanıcıya maruz kalmalı mıdır?


14

Genellikle doğal anahtarı olmayan bir tabloda, kullanıcıların benzersiz bir şekilde oluşturulmuş bir tanımlayıcıya sahip olması hala yararlıdır. Tablonun yedek bir birincil anahtarı varsa (ve böyle bir durumda kesinlikle beklemeniz gerekir), bu anahtar kullanıcıya açık olmalı mı yoksa bu amaçla başka bir alan kullanılmalı mıdır?

Yedek anahtarı göstermemenin bir nedeni, artık kayıtlar arasındaki ilişkiyi koruyan işlemler yapamayacağınız, ancak belirli silme / yeniden ekleme türleri gibi anahtar değerlerini, bir veritabanından veri kopyalamanın birçok yöntemi olarak değiştirememenizdir. başka, vb.

Yedek anahtarı ortaya çıkarmanın ana avantajı, zaten sahip olduğunuz bir alanı kullanmanın basitliğidir.

Hangi koşullar altında vekil anahtarı doğrudan kullanıcılara göstermek daha iyidir?


Bu sorunun bir kısmı 'kullanıcıları' tanımlamanız gerektiğidir. Kullanıcılar, ortaya koyduğunuz bir API'nın tüketicileri veya etli insanlar olabilir. Cevap her ikisi için de aynı olmayacak.
James Snell

1
Etli insanlar.
psr

Verilerin farklı tanımlanabildiği her durumun farklı bir tanımlayıcısı olmalıdır. Dolayısıyla, yeni bir sistem verilerinize bağlanırsa, kendi PK'sine sahip olmasını bekleyin ve bunu verilerinize ekleyin. "Çirkin su torbası" için görünürlük bu senaryo için bir 'sistem' sayılır. Tercih ettiğim çözüm varlıklar için anahtarları ve zaman damgalarını (ekleme ve değiştirme ve silme) özel bir tabloda saklamaktır. Bu şekilde veriler kolayca dağıtılabilir.

Yanıtlar:


10

Değiştirilmesi gereken kullanıcılara / müşterilere maruz kalan herhangi bir tanımlayıcıya hazır olmanız ve veritabanındaki bir satırın kimliğini değiştirmek ve bu değişikliğin tüm yabancı anahtarlara yayılması, yalnızca verileri kırmak istiyor.

Verilerin doğal bir işletme anahtarı yoksa, "işletme tanımlayıcısı" için ek bir alan ekleyebilirsiniz. Bu, kullanıldığı işlemler için optimize edilmelidir. Telefon tuş takımı girişi yalnızca sayısal anlamına gelir. Telefonda / sözlü olarak benzer sesli sembollerden (B / D, M / N, vb.) Kaçının. Hatta kolayca unutulmaz bazı ifade ("yeşil jöle") otomatik üretebilirsiniz.

Bunun etkisi, işletmenin daha sonra kayıtlara başvurmak istediklerini değiştirebilmesidir ve tek veri şeması değişikliği ya o kimlik stili için yeni bir sütun eklemek ya da zaten oradaki kimlikleri dönüştürmektir. Değişiklik tüm veritabanında yayılmaz ve yine de zaman içinde geçerli olan bir kimliğiniz (vekil) vardır.

Kısacası, yedek anahtarları kullanıcılara göstermekten kaçınırım. Yorumların belirttiği gibi, yedek anahtarlar neredeyse hiç değişmemelidir. Tersine, işletmeler her şeyi değiştirmek istiyor. Yedek anahtar açıkta kalırsa, işletmenin değiştirmek istediği sadece zaman meselesidir.

Bir yan not olarak, burada "teşhir" dediğimde, anahtarı doğrudan kullanmaları beklentisiyle kullanıcıya vermek istiyorum (sipariş numaralarını desteklemek için arama yapmak gibi).


5
Bu cevap bir anlam ifade etmiyor. Yedek anahtarlar hiçbir zaman değişmez ve bunları kullanıcılara göstermemek için bir dava açmadınız.
Robert Harvey

1
asla asla Deme. ikinci tasarım rekor konsolidasyona yol açarsa ne olur? ya yükseltmeniz ve kimliklerden uzaklaşmanız gerekiyorsa?
DougM

3
@DougM: Ardından kayıtları kendi yedek anahtarıyla yeni bir birleştirilmiş tabloya yazın ve orijinal anahtarları gerekirse yeni tablodaki (ve orijinal kaynak tabloyu tanımlayan bir alandaki) ayrı alanlarda saklayın. Bu tür bir konsolidasyon olağanüstü nadir olmalı ve sadece şişirilmiş bir tasarımın sonucu olarak olmalıdır. Benden sonra tekrar et: Surrogate. Anahtarlar. Asla. Değişiklik. Bu yüzden taşıyıcılar.
Robert Harvey

2
@RobertHarvey Yedek anahtarların asla değişmemesi gerektiğine katılıyorum, bu yüzden kötü dış tanımlayıcılar yaptıklarını düşünüyorum. Nasıl Sonunda bir müşteri değişikliği isteyeceksiniz onlar rekor bakın. Bu noktada, tüm sisteminizi değişmez vekil anahtarlar etrafında oluşturdunuz veya ileriyi düşündünüz ve iş tanımlayıcıları ile vekil anahtarlar arasında bir miktar dolaylılık belirlediniz.
Chris Pitman

2
@sqlvogel: "Vekil" yerine "sistem tarafından oluşturulan birincil anahtar" terimini kullanırsam işleri daha net hale getirir mi? Yedek anahtarları oluşturan algoritmayı değiştirmek isteyebileceğinizi kabul ediyorum, ancak bu temelde değişmez kalitelerini değiştirmiyor.
Robert Harvey

4

Bazı durumlarda, yedek anahtarlar beklenir ve kullanıcılar için mantıklıdır. En sevdiğim örnek "sipariş numarası". Sipariş numarası gerçekten doğal bir anahtar değildir: doğal bir anahtar zaman damgası artı kullanıcı olabilir ya da kullanıcıların zaman damganızın ayrıntı düzeyi içinde birden fazla sipariş oluşturmasını beklediğinizden daha fazla olabilir.

Bununla birlikte, kullanıcılar bir sipariş numarasının kolaylığını anlar ve bekler. Kullanıcılara bunları bildirirseniz, hiçbir zarar ve çok değer yoktur.

Öte yandan, bazı yedek anahtarlar bir kullanıcı için bir anlam ifade etmez. Tabii ki, sağlık sigorta şirketimin üye kimliğim, doğum tarihim, taşıyıcı vb. ve evrende benzersiz değil ... Bu yüzden sigorta şirketinde vekil anahtar).


Bir kullanıcı anlar ve onunla etkileşime girmeyi beklerse, artık bir yedek anahtar değildir. Yedek anahtarlar, iş anlamlarının olmadığı olarak tanımlanır. Bir kimlik numarası olması, bunun bir vekil olduğu anlamına gelmez. Ayrıca, "üye kimliğime, doğum tarihime [...] göre beni tanımlayan bazı vekil anahtarlar" mantıklı değil. Yedek anahtarlarının (iş anlamı olmayan) sizi doğal bir anahtar oluşturabilecek şeylere göre tanımladığını mı söylüyorsunuz?
Kyle McVay

Çoğu zaman, çalışan sisteminde aynı ada sahip diğer insanlardan farklı olmanız için size bir çalışan kimlik numarası verilir. Sigorta kartınızda, şirket ve çalışan kimliğiniz listelenebilir. Ancak sağlık sigortası şirketi, işvereninizden aldığı adı, doğum tarihini ve çalışan kimliklerini kullanmak yerine genellikle tüm sistemlerinde kullanabileceği kendi iç kimliğini oluşturur. Oluşturulan bu anahtarlar vekil mi yoksa doğal anahtarlar mı? Kime sorduğunuza bağlı olarak ( en.wikipedia.org/wiki/Surrogate_key adresindeki 2 alternatif tanımı kontrol edin )
Alan Shutko

1

Yedek anahtarı yalnızca doğru şekilde oluşturulmuş bir GUID / UUID * ise göstermeniz gerekir. OWASP Top 10 güvenlik sorunlarında sıralı vekil anahtarları göstermek 4 numaradır .

* Uygulamada, kriptografik olarak güvenli bir rasgele veya sahte rasgele sayı üreteci tarafından oluşturulduğunu bilmediğiniz sürece, bu amaçlar için düzgün bir şekilde oluşturulmadığını varsaymak en iyisidir.


2
Bir GUID'in güvenliği nasıl artırdığı cevabınızdan belli değil.
Robert Harvey

1
@RobertHarvey - Sanırım sıralı değiller ve tahmin edilemiyorlar.
Bobson


@RobertHarvey, açıkladı.
Peter Taylor

1

Bir tablonun doğal anahtarı yoksa, yedek anahtarlar böyle satırlara izin verir.

surrogate_key  some_name
--
1              Wibble
2              Wibble
...
17             Wibble
...
235            Wibble

Yedek anahtarlar yerine bu yapay anahtarları çağırırım, ancak bu ayrım bu soru için önemli değildir.

Şimdi, orada yabancı anahtarları aracılığıyla bu vekil anahtarlarını başvuran önemli veriler var, nasıl son kullanıcıların güncellemesine hangi satırın onlar eğer bilemez varsayarak yok vekil anahtar değerleri biliyor musunuz?


"Surrogate_key" sütununu etiketlemek biraz çelişkilidir, ancak daha sonra bunların "yedek anahtarlar yerine yapay anahtarlar" olduğunu söylerler. Bu yapay anahtarları, ticari bir anlamı olmadığı ve yalnızca benzersiz tanımlayıcılar olarak hizmet ettikleri için çağırıyorsanız, bu anahtarın doğallaştırılması (ifşa edilmesi) ve yeni bir yedek anahtar oluşturulması gerekir. yani, doğallaştırılmış surrogate_key'i iş anlamında bir adla yeniden adlandırın, istemcilere gösterin ve dahili işlemler için gerçek vekil olmak için yeni bir benzer sütun oluşturun. İdealden daha az, ama yine de gerçek bir vekil göstermekten daha iyi.
Kyle McVay

@KyleMcVay: Çelişkili değil. Asıl fikri "yerine koymak" olan vekilin anlamını onurlandırır . Bir vekil anahtar , doğal bir anahtarın yerine geçer. (Codd ve genel kullanım alanları içinde ilişkisel teori vekil anahtarında bu anlamda.) Bir tablo vardır olamaz hiçbir doğal anahtarı var o anlamda bir vekil anahtarı. Ancak, başka bir şey yerine kullanılan keyfi bir değere sahip olabilir . Ben buna yapay anahtar diyorum.
Mike Sherrill 'Cat Recall'

Tanımlarınız yanlış değil, ancak vekil anahtarın vekil kelimesinin ötesinde ek, sektöre özgü bir anlam üstlendiğini düşünüyorum . Bir anahtarı bir müşteriye ifşa edecekseniz, o anahtarın artık ticari anlamı olduğunu iddia ediyorum; o olmuştur vatandaşlığa ve şimdi temsil varlığın mantıksal parçası olarak kabul edilmelidir. Bu mantıkla, açık bir yedek anahtar diye bir şey yoktur. Yapay bir anahtarı açığa çıkaracaksanız, artık bir yedek anahtar değildir ve yeni bir anahtara ihtiyacınız vardır.
Kyle McVay

0

Layman'ın sözleriyle:

  • Taşıyıcılar kullanıcıdan gizlenmelidir.
  • Kullanıcıya başka bir işletme adayı anahtarını göstermelisiniz.
  • Başka aday anahtarı yoksa PK'yi göstermelisiniz. Ancak bu durumda PK, başka bir sütunun yerine geçmediği için bir vekil olarak kabul edilmez.

PK neden gösterilmeli? Sanırım bu benim sorum - otomatik olarak oluşturulmuş bir PK'ya doğru bir yedek anahtar adı verilip verilmediği teğet.
psr

1
@psr Soru başlığınızda " vekil anahtarlar hiç gösterilmiyor " yazıyor . Hayır dedim. Ama başka bir anahtar göstermelisin. Başka anahtar yoksa, sahip olduğunuz tek anahtarı göstermeniz gerekir. Teğetsel olarak, bu durumlarda, anahtarın gerçekten bir vekil olmadığını, çünkü başka bir sütunun yerine geçmediğini açıklığa kavuşturuyorum.
Tulains Córdova

Soru, bir sütun eklemeniz mi yoksa sahip olduğunuz anahtarı göstermeniz mi gerektiğidir.
psr

@psr Daha açık hale getirmek için cevabımı yeniden ifade ettim.
Tulains Córdova

1
Bunu maddi olarak önemsiz bir ayrım olarak görüyorum. Kuralınız her tablonun yapay bir anahtara sahip olması (benim olan) ve birleştirmelere yalnızca yapay anahtarların katılması (bu benim ilkemdir) ise, o zaman bir anahtarın vekil olduğu fikri, çünkü diğer anahtarlar muhtemelen kullanılabilir önemsizdir.
Robert Harvey

0

SADECE kullanıcıya doğrudan veya size raporlama hataları hakkında faydalı bilgiler sağlayan bir alan açığa çıkarmalısınız.

tersine, HER ZAMAN, kullanıcının gerçekleştirdiği etkileşim için bir kaydı (basit veya karmaşık) tanımlamanın temel aracı olduklarında "yedek anahtarları" göstermeniz gerekir.


0

Anahtarları son kullanıcıya maruz bırakıp bırakmamanız önemli değildir. Uygulamanız, örneğin sipariş kimliğini bilmenin normalde erişemeyecekleri bir şeye erişmesine izin vermeyecek şekilde gerekli yetkilendirmeyi gerçekleştirmelidir.

uyarı: Bu, sunucu tarafı yetkilendirmenin mümkün / mümkün olduğu web tabanlı veya n katmanlı bir uygulama olduğunu varsayar. Doğrudan sql yürüten bir VB uygulamanız varsa, bu bir bütün 'nother sorunu.


Soruda belirtildiği gibi yabancı anahtar ilişkilerini koruyarak kayıt ekleyip silememeye ne dersiniz?
psr

Bunun, anahtarın kullanıcıya gösterilmesiyle ne ilgisi var? Belki 'teşhir' terimini kullanımınızı anlamıyorum. 'Kullanıcı tarafından görülebilir' demek istediğiniz varsayımla çalışıyorum.
GrandmasterB
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.