PK sebagai ROWGUIDCOL atau menggunakan kolom panduan baris terpisah?


9

Ada perdebatan panjang yang terjadi di sini jadi saya ingin mendengar pendapat lain.

Saya punya banyak tabel dengan PK pengidentifikasi unik. Apakah ini ide yang bagus, di luar jangkauan (dan tidak akan berubah dalam waktu dekat).

Sekarang, database harus digabung diterbitkan dan DEVs menganjurkan penggunaan kolom rowguid terpisah daripada menandai PK yang ada sebagai ROWGUIDCOL.

Pada dasarnya, mereka mengatakan bahwa aplikasi tidak boleh membawa sesuatu ke domainnya yang hanya digunakan oleh replikasi (itu hanya "barang DBA" untuk mereka).

Dari sudut pandang kinerja, saya tidak melihat alasan mengapa saya harus menambahkan kolom baru untuk melakukan sesuatu yang bisa saya lakukan dengan yang sudah ada. Selain itu, karena ini hanya "barang DBA", mengapa tidak membiarkan DBA memilih?

Saya agak mengerti poin DEVs, tapi saya masih tidak setuju.

Pikiran?

EDIT: Saya hanya ingin menambahkan bahwa saya adalah minoritas dalam debat ini dan DEV yang mempertanyakan posisi saya adalah orang yang saya hormati dan percayai. Ini adalah alasan mengapa saya terpaksa meminta pendapat.
Saya mungkin juga kehilangan sesuatu dan bisa salah mengerti maksud mereka.


Apakah ada kemungkinan bahwa nilai PK mungkin perlu berubah di masa depan?
Robert L Davis

Tidak terlalu. Ini adalah kunci pengganti, sehingga aplikasi tidak terlalu banyak melakukan hal yang sama dengan kolom itu. Itu tidak pernah berubah dan tidak pernah ditampilkan kepada pengguna.
spaghettidba

Mengapa mereka menginginkan rowguidcol terpisah? Dan skema apa yang secara umum akan mereka pilih, jika mereka bisa, untuk PK, dan mengapa?
JustinC

@spaghettidba Berbicara tentang melintasi domain, seberapa sering Anda memberi tahu mereka pola desain apa yang harus atau tidak seharusnya mereka gunakan dalam kode aplikasi mereka? Mungkin mereka harus tetap berpegang pada "domain" mereka? ;-). Selain itu, menambahkan kolom 16 byte ke semua tabel akan mengerikan untuk kinerja dan tidak memberikan manfaat.
Solomon Rutzky

Jawaban:


7

Pada dasarnya, mereka mengatakan bahwa aplikasi tidak boleh membawa sesuatu ke domainnya yang hanya digunakan oleh replikasi (itu hanya "barang DBA" untuk mereka).

Aku sangat setuju. Tapi ... kunci utama tidak hanya digunakan untuk replikasi (mungkin aplikasi menggunakannya dalam beberapa cara). Argumen tidak masuk akal dalam konteks ini.

Bagaimanapun, sejauh yang saya ketahui, hanya ada 2 cara untuk "hal-hal DBA" ini untuk melintasi batas domain:

  1. Jika aplikasi menggunakan kueri yang mereferensikan ROWGUIDCOLkolom seperti ini:

    DECLARE @a table (id uniqueidentifier ROWGUIDCOL);
    
    SELECT ROWGUIDCOL FROM @a;

    Saya berasumsi belum ada kolom Anda yang memiliki properti ini, jadi aplikasi tidak akan melakukan ini. (Omong-omong, ROWGUIDCOLadalah konsep yang sepenuhnya terpisah dari replikasi. Kebetulan penggabungan replikasi menggunakannya.)

  2. Kolom kunci utama tidak lagi dapat diupdate. Jika aplikasi melakukan ini dan perubahan tidak akan dilakukan untuk menggunakan algoritma lain, tidak ada pilihan selain menambahkan kolom baru ke tabel, dan oleh karena itu tidak diperlukan diskusi.

Selain perilaku itu, ROWGUIDCOLproperti itu sepenuhnya transparan. Anda bisa menambahkannya, dan aplikasi tidak akan pernah tahu. Semua jenis skenario replikasi data harus setransparan mungkin untuk aplikasi.


Terimakasih telah menjawab. Tidak, aplikasi tidak melakukan 1. atau 2. Demi kelengkapan, beberapa tabel sudah dihiasi dengan properti ROWGUIDCOL di PK.
spaghettidba

Sementara saya setuju bahwa replikasi harus transparan untuk aplikasi, saya juga percaya bahwa database yang harus dipublikasikan harus dipikirkan untuk replikasi dari bawah ke atas. Manajemen identitas dalam replikasi gabungan sepenuhnya PITA, misalnya: jika Anda tahu sejak awal Anda harus menggabungkan publikasi, itu adalah satu hal yang harus dihindari.
spaghettidba

@spaghettidba: Ya, saya setuju sepenuhnya bahwa jika replikasi ada dalam kartu, database pasti harus dirancang untuk itu. Seringkali hanya dengan mengikuti praktik terbaik akan mendapatkan sebagian besar jalan ke sana; itu adalah database warisan yang jelek dan berbulu yang cenderung memiliki banyak masalah desain. Dari pengalaman saya, menggabungkan replikasi khususnya lebih menantang daripada mekanisme replikasi lainnya.
Jon Seigel

@spaghettidba dan Jon: Hanya FYI, penggunaan ROWGUIDCOLdalam konteks itu (yaitu tidak dalam CREATE TABLE/ ALTER TABLEpernyataan) telah ditinggalkan sejak setidaknya SQL Server 2008 R2 (mencari FeatureID 182) yang mendukung $ROWGUID.
Solomon Rutzky

6

Saya setuju. Selama tidak perlu nilai PK untuk dapat berubah, maka akan lebih baik menggunakan kolom uniqueidentifier yang ada sebagai rowguidcol.


5

"Pada dasarnya, mereka mengatakan bahwa aplikasi tidak boleh membawa ke domainnya sesuatu yang hanya digunakan oleh replikasi (itu hanya" barang DBA "untuk mereka)."

Tapi itu tidak digunakan untuk replikasi saja. Ini juga (dan sudah) PK Anda.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.