Ya itu ide yang buruk.
Alih-alih pergi:
SELECT Deal.Name, DealCategory.Name
FROM Deal
INNER JOIN
DealCategories ON Deal.DealID = DealCategories.DealID
INNER JOIN
DealCategory ON DealCategories.DealCategoryID = DealCategory.DealCategoryID
WHERE Deal.DealID = 1234
Anda sekarang harus pergi:
SELECT Deal.ID, Deal.Name, DealCategories
FROM Deal
WHERE Deal.DealID = 1234
Maka Anda perlu melakukan hal-hal dalam kode aplikasi Anda untuk membagi daftar koma itu menjadi angka-angka individual, lalu query database secara terpisah:
SELECT DealCategory.Name
FROM DealCategory
WHERE DealCategory.DealCategoryID IN (<<that list from before>>)
Antipattern desain ini berasal dari kesalahpahaman lengkap pemodelan relasional (Anda tidak perlu takut tabel. Tabel adalah teman Anda. Gunakan mereka), atau keyakinan salah arah yang aneh, lebih cepat mengambil daftar yang dipisahkan koma dan membaginya dalam kode aplikasi daripada menambahkan tabel tautan (tidak pernah ada). Opsi ketiga adalah bahwa mereka tidak cukup percaya diri / cukup kompeten dengan SQL untuk dapat mengatur kunci asing, tetapi jika itu masalahnya mereka seharusnya tidak ada hubungannya dengan desain model relasional.
SQL Antipatterns (Karwin, 2010) mencurahkan seluruh bab untuk antipattern ini (yang ia sebut 'Jaywalking'), halaman 15-23. Juga, penulis telah memposting pertanyaan serupa di SO . Poin-poin penting yang dia catat (sebagaimana diterapkan pada contoh ini) adalah:
- Permintaan untuk semua transaksi dalam kategori tertentu agak rumit (cara termudah untuk menyelesaikan masalah itu adalah ekspresi reguler, tetapi ekspresi reguler adalah masalah di dalam dan dari dirinya sendiri).
- Anda tidak dapat menerapkan integritas referensial tanpa hubungan kunci asing. Jika Anda menghapus DealCategory nr. # 26, Anda kemudian, dalam kode aplikasi Anda, harus melalui setiap transaksi mencari referensi ke kategori # 26 dan menghapusnya. Ini adalah sesuatu yang harus ditangani pada lapisan data, dan harus menanganinya di aplikasi Anda adalah hal yang sangat buruk .
- Permintaan agregat (
COUNT
, SUM
dll), sekali lagi, bervariasi dari 'rumit' hingga 'hampir tidak mungkin'. Tanyakan pengembang Anda bagaimana mereka membuat Anda daftar semua kategori dengan jumlah jumlah penawaran dalam kategori itu. Dengan desain yang tepat, itulah empat baris SQL.
- Pembaruan menjadi jauh lebih sulit (yaitu Anda memiliki kesepakatan yang ada di lima kategori, tetapi Anda ingin menghapus dua dan menambahkan tiga yang lain). Itu tiga baris SQL dengan desain yang tepat.
- Akhirnya Anda akan mengalami
VARCHAR
batasan panjang daftar. Meskipun jika Anda memiliki daftar yang dipisahkan koma, lebih dari 4000 karakter, kemungkinan parsing monster itu akan menjadi lambat sekali.
- Menarik daftar dari database, membaginya, dan kemudian kembali ke database untuk query lain secara intrinsik lebih lambat dari satu query.
TLDR: Ini adalah desain yang cacat secara fundamental, tidak akan menskala dengan baik, ini memperkenalkan kompleksitas tambahan bahkan untuk pertanyaan paling sederhana, dan saat itu juga, itu akan memperlambat aplikasi Anda.