Tanggapan untuk pertanyaan pribadi Anda
Jika saya ingin menambahkan kolom Club
yang menggambarkan pemilik, yang juga akan menjadi anggota, apa pendekatan terbaik tanpa meminta anggota yang sama terdaftar dua kali?
Jika — sebagaimana dinyatakan dalam spesifikasi Anda— a Person can be a Member of only one Club
, dan Anda tertarik untuk menyimpan datum ini hanya sebagai benar atau salah , satu opsi menambahkan kolom a BIT(1)
atau BOOLEAN
( TINYINT
) ke Person
tabel, dan Anda mungkin ingin memanggil kolom ini IsClubOwner
. Dengan cara ini, Anda dapat mendaftarkan fakta bahwa orang yang ditentukan adalah pemilik klub secara eksklusif satu kali. Selain itu, metode ini juga memungkinkan kemungkinan mempertahankan beberapa orang sebagai pemilik klub yang sama . Anda dapat melihat gambaran level logis dari pendekatan ini pada Gambar 1 .
Namun, Anda mencari pendekatan terbaik dan, menurut pengalaman saya, pendekatan semacam itu memerlukan pengembangan struktur yang jauh lebih diperluas dan serbaguna. Dalam hal ini, ikuti perkembangan latihan pemodelan untuk poin-poin ini dan lainnya di bawah ini, di bagian berjudul "Meliputi spesifikasi Anda yang tersisa", "Orang sebagai Anggota dari banyak Klub" dan "Anggota dan Pemilik sebagai jenis entitas yang terpisah".
Haruskah saya meletakkan semua meja saya di selisih otomatis id
atau apakah ini ide yang buruk? (manfaat / kerugian?)
Jika Anda menghadapi eksplisit persyaratan yang menunjukkan definisi tabel dengan kolom karakteristik tersebut, dan kolom yang memiliki makna kontekstual yang valid atau memiliki tujuan tertentu seperti menjadi pengganti untuk lebar PRIMARY KEY alami (PK), maka ya, Anda harus melanjutkan dengan cara itu.
Jika tidak, jika Anda tidak mengatakan persyaratan, saya menganggap itu akan unnecesary karena Anda harus menyimpan dan mengelola kolom tambahan berarti dan (mungkin?) Juga INDEX tambahan dalam database Anda.
Seperti biasa, Anda harus menganalisis setiap kasus beserta dampak keseluruhannya untuk memutuskan bagaimana melanjutkannya.
Jika saya menambahkan kunci asing di tab kunci asing, akankah ini secara otomatis sesuai dengan tabel yang benar atau apakah saya harus menambahkan ini ke kolom juga?
Dalam hal ini, saran saya untuk Anda adalah membuat struktur database Anda secara manual, untuk mengkode DDL
pernyataan Anda sendiri sampai Anda mendapatkan pemahaman yang kuat tentang subjek. Jika Anda melakukannya, akan lebih mudah bagi Anda untuk memahami proses yang dilakukan alat grafis “di bawah tenda”.
Bagi saya, misalnya, membuat pernyataan seperti berikut:
CONSTRAINT FK_PersonPhoneNumber_to_Person FOREIGN KEY (PersonId)
REFERENCES Person (PersonId)
Jauh lebih instruktif daripada menggunakan alat GUI untuk menjalankan tugas semacam ini, terutama sekarang karena Anda sedang membangun desain pertama Anda.
Dan pertanyaan saya yang mungkin paling noobiest dari semua ... Apakah saya meletakkan kunci asing phone_number
dan email
di meja masing-masing yang terhubung ke person_id
atau haruskah saya letakkan phone_number
dan email
ids
di meja orang?
Secara pribadi, saya pikir ini dan semua pertanyaan Anda yang lain benar - benar valid dan dikontekstualisasikan dengan baik .
Kembali ke aspek teknis yang menjadi perhatian kami, penyelidikan yang tepat ini menawarkan kesempatan yang baik untuk meninjau kembali dua pernyataan berikut:
A Person can be reached through zero-one-or-many PhoneNumbers
A PhoneNumber can be used to reach one-to-many People
Jadi, orang dapat menyimpulkan bahwa ada banyak-ke-banyak hubungan antara Person
dan PhoneNumber
, oleh karena itu, saya menyarankan pembuatan tabel asosiatif yang dinamai PersonPhoneNumber
untuk mewakili hubungan tersebut dalam database Anda. PK dari tabel ini harus terdiri dari dua kolom berbeda: PersonId
(a ASING KUNCI [FK] menunjuk ke Person.PersonId
) dan PhoneNumber
(sebuah FK yang membuat referensi ke PhoneNumber.Number
). Untuk deskripsi level logis dari semua hal di atas, lihat Gambar 1 .
Di sisi lain, mari kita periksa dua proposisi berikut:
A Person can be contacted via zero-one-or-many EmailAddresses
An EmailAddress can be used to contact exactly one Person
Maka, ya, Anda harus menetapkan referensi FK Person
dari EmailAddress
tabel, dan tabel ini harus memiliki PK komposit juga, yang akan terdiri dari kolom PersonId
dan Address
. Dengan cara ini, Anda dapat memastikan bahwa kombinasi yang sama EmailAddress.PersonId
dan EmailAddress.Address
dapat dimasukkan hanya sekali.
Jika Anda juga ingin memastikan bahwa yang diberikan EmailAddres.Address
dapat disimpan dalam satu baris tunggal, Anda hanya perlu membuat CONSTRAINT UNIK untuk kolom ini.
Model data logis yang diajukan
Untuk mengekspos saran saya lebih jelas, saya memasukkan empat model logis IDEF1X [1] yang ditunjukkan pada Gambar 1 , Gambar 2 , Gambar 3 dan Gambar 4 . Saya akan memberikan penjelasan tentang fitur yang paling relevan yang ditampilkan di masing-masing fitur tersebut di bagian yang sesuai. Anda juga dapat mengunduh dari Dropbox, PDF yang terintegrasi dalam model tunggal, sebagian besar elemen yang sedang dibahas.
Menutupi spesifikasi yang tersisa
Menghubungkan Orang dan Alamat
Mari kita periksa dua pernyataan berikut (sedikit ditulis ulang) yang relevan untuk orang dan alamat :
A Person can only have one Address
An Address can belong to different People (couples or siblings)
Jadi, untuk menghadapi pembatasan ini, Anda dapat memilih untuk mengimplementasikan model data yang mirip dengan yang dapat Anda lihat pada Gambar 1 .
Dengan mempertimbangkan model yang dimaksud, Anda harus mengikuti langkah-langkah berikut:
Buat tabel yang disebut PersonAddress
memperbaiki hubungan antara Person
dan Address
. Atur kolom PersonId
dan AddressId
sebagai senyawa PK dari tabel ini.
Konfigurasikan KONSTRA UNIK untuk PersonAddress.PersonId
kolom untuk memastikan bahwa nilai tertentu dapat dimasukkan paling banyak pada satu baris tabel tersebut. Pada tingkat logis, keadaan ini menyiratkan bahwa PersonAddress.PersonId
telah menjadi KUNCI ALTERNATE [2] .
Jika nilai AddressId
dalam PersonAddress
upaya penyisipan yang ditentukan belum disimpan, maka biarkan penyisipan berlanjut, jika tidak, ketika nilai tersebut sudah ada dalam satu baris, Anda harus memeriksa bahwa (a) PersonId
siapa yang telah terdaftar yang AddressId
juga terdaftar sebagai Marriage.WifeId
jika itu PersonId
adalah laki-laki (datum berasal dari Person.GenreCode
) atau (b) bahwa itu PersonId
adalah Marriage.HusbandId
ketika PersonId
adalah perempuan (berasal berdasarkan Person.GenreCode
, juga). Jika salah satu dari kondisi ini terpenuhi dalam situasi yang sesuai, maka Anda harus membiarkan INSERT berjalan.
Jika kondisi di atas tidak terpenuhi, masih ada peluang untuk PersonAddress
penyisipan mencoba untuk berhasil. Anda harus memeriksa bahwa PersonId
nilai yang terlibat dalam penyisipan kata mencoba berbagi setidaknya satu Progeny.ParentId
dengan PersonId
yang sudah terdaftar PersonAddress.AddressId
. Jika kondisi ini terpenuhi, maka itu berarti mereka disimpan seperti Siblings
dalam database, jadi INSERT ini harus berhasil.
Seperti dalam implementasi basis data relasional, Anda harus secara serius mempertimbangkan untuk mengeksekusi DML
operasi Anda di dalam Transaksi ACID sehingga Anda dapat melindungi integritas dan konsistensi data yang Anda kerjakan.
Menghadiri persyaratan yang Anda tambahkan dalam komentar: Alamat dan Nomor Telepon melayani Klub dan Orang yang sama
Dengan syarat Anda ingin memberikan kesempatan untuk alamat dan nomor telepon untuk melayani orang dan klub , Anda dapat menggunakan hubungan supertipe-subtipe . Berikut ini adalah jawaban di mana saya memberikan perawatan yang lebih rinci untuk struktur semacam ini, jika Anda tertarik.
Dalam skenario ini, Anda dapat mendefinisikan Person
dan Club
sebagai subtipe dari entitas baru yang dinamai Party
, istilah yang biasa digunakan dalam lingkaran hukum untuk membela (a) seseorang atau (b) sekelompok orang (sebagaimana disebutkan dalam pengertian nomor 6 ). Dengan metode ini, hubungan antara Addresses
(atau PhoneNumbers
) People
dan Clubs
akan ditentukan melalui Party
, supertype. Lihat Gambar 2 untuk penggambaran saran ini.
Pesta dan Alamat
Jadi kita dapat membaca dalam model baru ini bahwa:
A Party keeps zero-one-or-many Addresses
An Address is kept by one-to-many Parties
Dengan demikian, ada banyak-ke-banyak hubungan yang melibatkan Party
dan Address
yang diungkapkan melalui PartyAddress
entitas.
Pesta dan Nomor Telepon
Selanjutnya, kita dapat menafsirkan bahwa:
A Party is reached through zero-one-or-many PhoneNumbers
A PhoneNumber is used by one-to-many Parties
Itulah sebabnya saya menambahkan PartyPhoneNumber
entitas yang menggambarkan asosiasi banyak ke banyak yang berlaku antara jenis Party
dan PhoneNumber
entitas.
Pesta dan Klub atau Orang
Kemudian, dapat juga dibaca bahwa:
A Party is either a Club or a Person
Karenanya, Party
memasok koneksi dari salah satu Clubs
atau People
ke Addresses
(atau PhoneNumbers
).
Pribadi sebagai Anggota beberapa Klub
Seperti @aldwinaldwin menyebutkan dalam jawabannya, jika Anda ingin memberikan fungsionalitas bagi seseorang untuk menjadi anggota dari beberapa klub , maka Anda dapat menyertakan tabel yang disebut ClubMember
yang akan bertindak sebagai hubungan banyak-ke-banyak lainnya, kali ini, tentu saja , interkoneksi Person
dan Club
.
Saya akan menambahkan di atas bahwa tabel ini juga dapat berguna dalam tujuan menyimpan orang konkret sebagai pemilik beberapa klub , dengan cara memasukkan IsClubOwner
kolom boolean yang telah disebutkan . Bahkan, dapat dikatakan bahwa tabel baru ini adalah representasi dari tipe entitas integral dalam haknya sendiri.
Seperti ditunjukkan pada Gambar 3 , tabel tersebut membutuhkan PK komposit yang terdiri dari kolom ClubId
dan MemberId
( nama peran [3] diberikan kepada PersonId
), dan kolom ini harus didefinisikan juga sebagai FK yang menunjuk, sesuai, ke Club
dan Person
.
Struktur yang lebih mudah beradaptasi
Dengan menggunakan pengaturan ini, Anda juga dapat mematuhi aturan awal yang menyatakan itu a Person can be a member of only one Club
, tetapi Anda hanya perlu menambahkan CONSTRAINT UNIK ke MemberId
kolom, sehingga nilai tertentu dapat dimasukkan dalam tidak lebih dari satu kali. Jadi, seperti yang Anda perhatikan, struktur ini jauh lebih mudah beradaptasi bahwa yang ditunjukkan pada Gambar 1 , karena dengan menjatuhkan UNIK CONSTRAINT (atau INDEX) Anda akan membuka fungsi tersebut perijinan sebuah seseorang untuk menjadi anggota dari berbagai klub di waktu yang sama.
Anggota dan Pemilik sebagai jenis entitas terpisah
Seperti yang Anda tahu, penyimpanan beberapa fakta tentang peran yang dilakukan oleh orang sebagai pemilik dari klub -besides keberadaan belaka dalam benar atau salah attribute- bisa sangat menguntungkan. Sebagai contoh, Anda mungkin ingin menyimpan tanggal efektif di mana pasti orang menjadi pemilik dari sebuah klub , maka Anda dapat mengelola situasi ini dengan memperkenalkan jenis entitas yang terpisah yang disebut ClubOwner
, seperti disajikan pada Gambar 4 .
Setelah Anda membuat tabel berdasarkan tipe entitas baru ini, Anda bisa menambahkan kolom pas yang mewakili karakteristik yang berperan secara eksklusif ketika a Person
adalah Owner
a dari a Club
. Seperti yang digambarkan, tabel ini akan menampung PK yang terdiri dari kolom-kolom FK yang merujuk Person.PersonId
dan Club.ClubId
, dengan cara ini kombinasi ClubOwner.OwnerId
(atau ClubOwner.PersonId
, jika Anda mau) dan ClubOwner.ClubId
dapat dimasukkan hanya dalam satu kesempatan.
Tentu saja, dengan konfigurasi ini Anda masih dapat memperoleh dalam bentuk boolean jika a Person
adalah yang Owner
khusus Club
dengan bantuan kueri yang mengembalikan nilai skalar yang dapat dievaluasi menjadi benar atau salah .
Catatan
1. Definisi Integrasi untuk Pemodelan Informasi ( IDEF1X ) adalah teknik pemodelan data yang sangat direkomendasikan yang didefinisikan sebagai standar pada bulan Desember 1993 oleh Institut Standar dan Teknologi Nasional ( NIST ) Amerika Serikat . Hal ini kokoh didasarkan pada (a) beberapa makalah teoritis ditulis oleh pencetus dari Relational Model , yaitu, Dr EF Codd ; pada (b) teori Entity-Relationship , yang dikembangkan oleh Dr. PP Chen ; dan juga pada (c) Teknik Desain Basis Data Logis , yang dibuat oleh Robert G. Brown . Perlu dicatat bahwa IDEF1X adalahdiformalkan dengan cara logika tingkat pertama .
2. ALTERNATE KEY adalah atribut (atau kombinasi dari atribut) yang menyimpan nilai-nilai yang secara unik mengidentifikasi kejadian entitas tetapi tidak dipilih sebagai PK dari jenis entitas terkait; setiap tipe entitas dapat memiliki nol, satu atau lebih tombol ALTERNATE. Dalam model IDEF1X, mereka diindikasikan sebagai "AK" ditambah nomor masing-masing, misalnya, AK1, AK2, dll. Mereka biasanya diimplementasikan dalam struktur SQL DDL melalui KONSTRA UNIK (atau INDIK UNIK ).
3. Nama peran adalah denotasi (atau alias) yang ditugaskan untuk atribut FK untuk mengekspresikan makna yang mereka pegang dalam lingkup entitas masing-masing. Penggunaannya direkomendasikan sejak 1970 oleh Dr. Codd dalam makalah seminalnya yang berjudul “Model Data Relasional untuk Bank Data Bersama Besar” . Untuk bagiannya, IDEF1X — menjaga kesetiaan dalam praktik relasional — juga menganjurkan penamaan peran.
clubId
nomor telepon juga dan membiarkan klub atau orang tidak ada?