İlişkisel bir veritabanında numaralandırılmış bir türü nasıl temsil etmeliyim?


12

Şirketim için üzerinde çalıştığım bir cihazda gerçekleşen işlemleri izleyen ilişkisel bir veritabanı geliştirmeye çalışıyorum. Cihazda oluşabilecek farklı işlem türleri vardır, bu nedenle ana kayıt tablolarımızdan birinde "trans_type" alanına sahibiz. Grubum bu alanın türünü bir tamsayı yapmaya ve bu alanı numaralandırılmış bir tür olarak ele almaya karar verdi. Sezgim bana bu alanı bir dize yapmanın daha iyi bir fikir olacağını, böylece veritabanı verilerimizin daha okunabilir ve kullanılabilir olacağını söylüyor. İş arkadaşlarım bunun değerinden daha fazla belaya neden olacağından endişeli görünüyor. Bu dize karşılaştırmaları çok maliyetlidir ve yazım hataları olasılığı çok büyüktür.

Yani, sizce, esasen numaralandırılmış bir değer olan ilişkisel bir veritabanındaki bir alanla uğraşırken, bu alanı bir tamsayı veya bir dize yapmak daha iyi bir tasarım kararı mıdır? Yoksa gözden kaçırdığım başka bir alternatif var mı?

Not: açık numaralandırılmış türler kullandığımız veritabanı tarafından desteklenmez. Ve geliştirdiğimiz bu veritabanı ile arayüz oluşturacak yazılım C ++ ile yazılmıştır.


Vadesi geçmiş tabloya işaretli bir tür tanımı yapmak için gecikmiş başka kimseye çarpıyor mu? Şuna benzer: CREATE TABLE isabet (ip varchar (40), ip_class ENUM (0, "IPv4", 1, "IPv6")); = <Ve> komutunu, sıra veya dizeyle (sıra ile eşleşen) kontrol etmenize izin vermelidir.
dlamblin

Yanıtlar:


26

Numaralandırılmış türler, veritabanınızda kimlik numarası, dize adı ve yararlı bulabileceğiniz diğer tüm sütunlara sahip ayrı bir tablo olmalıdır. Daha sonra her tür bu tabloda bir satır olarak bulunur. Sonra tablonuzda işlemleri kaydediyorsunuz "trans_Type" alanı bu referans tablosunun anahtarı için yabancı bir anahtar olmalıdır. Bu veritabanı normalleştirmesinde standart bir uygulamadır.

Bu şekilde, bir resmi ad dizesini sakladınız, performans için sayı karşılaştırmalarını kullanın ve her işlemin geçerli bir türe sahip olduğu referans bütünlüğüne sahip olursunuz.


1
Evet ve 'O'yu' Aç 'olarak değiştirmeye karar verirseniz, yalnızca bir satırı değiştirmeniz gerekir.
Daniel Kaplan

+1. basit bir int / string tablo ilişkisel db enumsları temsil etmek için en iyi yoldur.
mike30

Muhtemelen, Java çözüm arıyorsanız sonraki ziyaretçi bulmak o kullanışlı
Jauhien

2
Bu. Ek kredi için - dev ekibi bir Java / C # enum veya benzer bir şeydeki tam sayıları tanımladıysa, kod enum tanımlamasının arama tablosundan ayrılıp ayrılmadığını kontrol eden bir test yazabilirsiniz. Her zaman bir öğeyi sırayla eklemenin bir şeyleri senkronize etmeme tehlikesi vardır ve canlı bir veri kaydı yanlış görünene kadar fark etmezsiniz.
Julia Hayward

4

Yaygın bir uygulama, bir trans_typestablo oluşturmak ve daha sonra ana tablonuzun, adlandırılmış yabancı anahtarla başvurmasını sağlamaktır trans_type_id. Bu, kayıtlarınızın yalnızca geçerli numaralandırılmış türlere başvurmasını sağlar.

Misal:

trans_type
----------
  İD
  isim

işlemler
------------
  İD
  trans_date
  ayrıntılar
  trans_type_id (FK - trans_type.id)

Örnek Veriler:

trans_type

ID | ADI
----------
1 | SUNMAK
2 | İPTAL ETMEK


işlemler

ID | trans_date | trans_type_id
---------------------------------
1 | 2012-12-31 | 1
2 | 2013-01-09 | 2

3

Değerler veritabanına tamsayı olarak geliyorsa, bunları bu şekilde saklayın. Veritabanına yazarken dizelere dönüştürmenin başını koymaya gerek yoktur. Her zaman dize / metin değerlerine sahip bir arama tablosuyla ilişkilendirebilirsiniz (Daha Normalleştirilmiş).

Bu, bir çeşit güncelleme rutini çalıştırmak yerine dize değerini tek bir konumda güncelleme avantajına sahiptir. 1 = 'Kırmızı' yerine 'Gerçekten Kırmızı'ya eşit olabilir

Bu, dize değerlerine sahip tek bir tabloya (Denormalized) ihtiyaç duyulmasına kıyasla performans raporlaması için ideal değildir. Bu alandaki bir dizin performansı yeterince iyi yapar.

Çoğu RDBMS yeterli beygir gücüne izin verecektir. Tabloyu düz veri formunda 'okuyabilme' fikriniz olsa da, bir masaya katılmak önemli değildir. Sadece bir görünüm veya benzer bir nesne kullanma alışkanlığı edinin.


2

Ayrı numaralandırma tablosu yaklaşımını savunan bu sorunun diğer cevaplarına katılmıyorum.

Ancak, kesinlikle söylenmiş olanları tekrarlamamaktan yanayım, bu yüzden Stack Overflow'daki aynı soruya (daha fazla veya daha az) kabul edilen cevaba atıfta bulunacağım: /programming//a/229919 / 114626


Bağlantılı cevap için +1. Bu soru için, bağlantılı cevabınız doğru gibi görünüyor. Ancak elbette, eğer sorgulayıcı numaralandırılmış türlerde esneklik istiyorsa, bir referans tablosu çok daha iyi olacaktır.
Harke
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.