İlişkisel veritabanlarındaki arama tablolarıyla ilgili en iyi uygulamalar nelerdir?


14

Arama tabloları (veya bazılarının dediği gibi kod tabloları ) genellikle belirli bir sütun için verilebilecek olası değerlerin toplamıdır.

Örneğin party, iki sütunu olan (siyasi partiler hakkında bilgi depolamak için) adlı bir arama tablonuz olduğunu varsayalım :

  • party_code_idn, sistem tarafından oluşturulan sayısal değerleri tutar ve ( iş alanı anlamından yoksundur ) gerçek anahtar için bir vekil olarak çalışır.
  • party_code, iş alanı çağrışımları olan değerleri koruduğu için tablonun gerçek veya "doğal" anahtarıdır .

Ve böyle bir tablonun aşağıdaki verileri sakladığını söyleyelim:

 +----------------+------------+
 | party_code_idn | party_code |
 +----------------+------------+
 |              1 | Republican |
 |              2 | Democratic |
 +----------------+------------+

party_codeDeğerler 'Cumhuriyet' ve 'Demokratik', tablonun gerçek tuşu olan UNIQUE sınırlamasıyla kurulur, ama isteğe bağlı olarak ilave tutar sütun, party_code_idnve olsa masanın (bir PK olarak tanımlanan mantıksal konuşma , party_codePRIMARY KEY [PK]) olarak çalışabilir.

Soru

İşlem tablolarından arama değerlerine işaret etmenin en iyi uygulamaları nelerdir ? YABANCI ANAHTAR (FK) ya (a) doğrudan doğal ve anlamlı değere ya da (b) değerleri aşmak için referanslar oluşturmalı mıyım ?

Seçenek (a) , örneğin,

 +---------------+------------+---------+
 | candidate_idn | party_code |  city   |
 +---------------+------------+---------+
 |             1 | Democratic | Alaska  |
 |             2 | Republican | Memphis |
 +---------------+------------+---------+

aşağıdaki özelliklere sahiptir 1 :

  1. Son kullanıcı için okunabilir (+)
  2. Sistemler arasında kolay ithalat-ihracat (+)
  3. Tüm referans tablolarında değişiklik yapılması gerektiğinden değeri değiştirmek zor (-)
  4. Yeni değer eklemek pahalı değildir (=)

Uygulama programlama jargonunda fonksiyon çağrısından bir benzetme yapmak neredeyse “ değere göre geç ” gibi bir şey .

Seçenek (b) , örneğin,

 +---------------+----------------+---------+
 | candidate_idn | party_code_idn |  city   |
 +---------------+----------------+---------+
 |             1 |              1 | Alaska  |
 |             2 |              2 | Memphis |
 +---------------+----------------+---------+

aşağıdaki özelliklere sahiptir:

  1. Son kullanıcı için okunamıyor (-)
  2. İhtiyaç duymamamız gerektiğinden ithalat-ihracat yapmak zor (-)
  3. Yalnızca işlem tablolarında referansları depoladığımız için değerleri değiştirmek kolaydır (+)
  4. Yeni değer eklemek pahalı değildir (=)

Uygulama programlama bölümünde fonksiyon çağrısı ile karşılaştırıldığında " referans ile geç " e çok benzer .

İthalat-İhracat da farklı bir şekilde yapılabilir, yani sadece arama tablosunu tekrar doldurarak ve sonra vekil sütunu yeniden tohumlayabilirsiniz. Umarım bunu doğru anlıyorum, bu bir olasılık olarak duyduğum bir şey.

1. Not olduğunu +, -ve =bu özelliklerin yararını göstermektedir.

Soru

Oldukça önemli: Eğer ikinci yaklaşımı kullanacaksak, bir arama (veya kod ) tablosu ile FK referansı arasında bir fark var mıdır ? Bence aynı şekilde çalışıyorlar.

Alakalı kaynaklar

Yanıtlar:


10

By IDNSanırım sen bir demek IDENTITY, SEQUENCEya da AUTO_INCREMENTalan? Buraya ve buraya bir bakmalısın .

Şekil 10 altında, ilk başvurunun 5. bölümüne (Veri değerlerini Veri Öğesi Olarak Yanlış Kullanma) dikkat edin

Tabii ki satış personeli için ayrı bir masaya sahip olabilir ve daha sonra, yukarıda gösterilen sales_person_id gibi basit bir yedek anahtarla yabancı bir anahtar kullanarak referans verebilirsiniz.

Bu nedenle, bu uzman anahtarları "ertelemeniz" gerektiğini düşünüyor. Gerçekten oldukça basit bir SQL tekniğidir ve günlük SQL'inizde sorunlara neden olmamalıdır. Şekil 10'da bir hata var gibi görünüyor - SalesData'daki sales_person metni değil bir yedek anahtar (yani bir sayı) olmalıdır. Bunu yukarıdaki alıntıdan çıkarım.

Her ne pahasına olursa olsun kaçınmalısınız ne (1) Ortak Arama Tabloları bölümünde özetlenen hatayı taahhüt cazip (acemi veritabanı programcıları için çok yaygın). Bu genellikle MUCK ( Devasa Birleştirilmiş Kod Anahtarı ) yaklaşımı olarak adlandırılır ( kazara değil :-), özellikle Joe Celko tarafından , OTLT - Bir Gerçek Arama Tablosu olarak da bilinir ) ve her türlü zorluğa yol açar. Acemi programcıları tek bir kod / arama / herhangi bir tablonun "temiz" olduğunu ve gerçeğin ötesinde bir şey olmadığında daha verimli olacağını düşünüyorlar.

Yukarıdaki ikinci referanstan:

Normalleştirme gereksiz verileri ortadan kaldırır, böylece veri bütünlüğünü zorlama görevini çok daha basit hale getirir, ancak bir MUCK oluşturma işlemi tamamen başka bir şeydir. göstereceğim gibi, daha az tablo basitlik eşit değildir.

Burada ele aldığım ilgili EAV ( Varlık Öznitelik Değeri ) paradigmasına da göz atmak isteyebilirsiniz .


IDN ile, otomatik oluşturulan yabancı anahtarı kastediyorum. Ortak Arama Tablolarını kullanmıyorum, bunu nasıl kullandığımı sandığınızdan emin değil misiniz? Aslında yüzlerce Kod Tablosu gibi kullanıyoruz. Birisinin bunu birleşik bir tabloda yapması gerçekten tuhaf görünüyor. Ancak böyle bir paterni bilmek güzeldir ve kaçınılmalıdır. EAV ilginç görünüyor. Yani fikir birliği IDN yani vekil anahtar kullanarak dereference gerekir?
Nishant

1
"Dereferencing" stratagem kesinlikle çoğunluk yaklaşımı gibi görünüyor. Neden biraz deneyip nasıl ilerlediğini görmüyorsun? Bazı doğal anahtarları seçin ve SQL'inizin nasıl çalıştığını görün - daha sonra bir vekil belirtin ve bir süre bununla uğraşın. Celko ve Pascal'a SQL / İlişkisel dünyada saygı duyulacaktı, ancak onlarla tartışan insanların yaklaşımlarının çok doktrin ve safkan olduğunu ve "gerçek dünya" sistemlerinin vekil anahtarlar kullanması gerektiğini söyleyerek gördüm. Doğal anahtarınız üç alansa ve bu başka bir FOREIGN KEYtabloda ise, oldukça dağınık olabilir ama YMMV.
Vérace

Evet, bu saf bir düşünceye sahiptim ve ppl neden yedek anahtarları kullanıyor gibiydim! Ve sonra bazı kullanım vakalarının saf dünyada ele alınması gerçekten zor görünüyordu. İthalat ve ihracatta bazı dezavantajlarınız olsa da, vekil yaklaşımın daha kolay olduğunu hissettim. Gerçekten de kombinasyon senaryosu daha karmaşık olabilir. Btw Kod Tabloları vekil senaryoda Yabancı Anahtardan çok farklı değil mi? Yani mantıksal ayrım var ama onun Yabancı Anahtar'dan başka bir şey yok.
Nishant

1
Doğal anahtarlarınızı UNIQUE CONSTRAINTs ve NOT NULLs ile zorlayabilirsiniz - Peki, Kod Tablosu girişleriniz FOREIGN KEYbunları kullanan / bunlara başvuran tablolarda bulunur - böylece kavramlar ilişkilidir, ancak aynı değildir. Kod Tablosunun yedek anahtarı, "alt" tabloda görünen alan - kesinlikle daha az okunaklı, ancak INTçok büyük değil - yedek anahtarların avantajı olan çok fazla alan gerektirmeyen alandır.
Vérace

10

İki seçeneğinizin avantajlarından bazılarına sahip olan üçüncü bir yaklaşım var - kod tablosuna gerçek bir kod koyun. Bununla, tam değerin özünü yakalayan ve benzersiz olan kısa bir karakter dizisini kastediyorum. Verdiğiniz örnek için,

Idn: 1
Name: Democrats
Code: D      (or DEM)

Kod, yabancı anahtar olarak işlem tablolarına taşınır. Kısa, anlaşılır ve "gerçek" verilerden biraz bağımsızdır. Bir adda yapılan artımlı değişiklikler, kod değişikliği yapılmasını önermez. Ancak Cumhuriyetçiler topluca çökerse , yedek bir kimliğin oluşmayacağı sorunlarıyla birlikte bir kod değişikliği gerekli olabilir.

Bu stile kısaltma kodlaması denir. Celko'nun bu konudaki yazısını önerebilirim. Google kitaplar çeşitli örneklere sahiptir. Arama sonucu "Celko encoding".

Diğer örnekler: ülkeler için 2 veya 3 harfli kodlama, para birimi kodları için 3 harfli kodlama (GBP, USD, EUR). Kısa, kendi kendini açıklayan ve değişmeyen (ve onlar için bir ISO var).

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.