Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Desain basis data untuk pengaturan pengguna

Jawaban lain dengan cakap menguraikan pro dan kontra dari berbagai opsi Anda.

Saya percaya bahwa Opsi 1 (tas properti) Anda adalah desain keseluruhan terbaik untuk sebagian besar aplikasi, terutama jika Anda membangun beberapa perlindungan terhadap kelemahan tas properti.

Lihat ERD berikut:

Di ERD di atas, USER_SETTING tabel sangat mirip dengan OP. Perbedaannya adalah alih-alih varchar Code dan Value kolom, desain ini memiliki FK ke SETTING tabel yang mendefinisikan pengaturan yang diizinkan (Kode) dan dua kolom yang saling eksklusif untuk nilai tersebut. Salah satu opsi adalah bidang varchar yang dapat mengambil jenis input pengguna apa pun, yang lainnya adalah FK ke tabel nilai hukum.

SETTING tabel juga memiliki tanda yang menunjukkan apakah pengaturan pengguna harus ditentukan oleh FK atau oleh input varchar yang tidak dibatasi. Anda juga dapat menambahkan data_type ke SETTING untuk memberi tahu sistem cara menyandikan dan menafsirkan USER_SETTING.unconstrained_value . Jika mau, Anda juga dapat menambahkan SETTING_GROUP tabel untuk membantu mengatur berbagai pengaturan untuk pemeliharaan pengguna.

Desain ini memungkinkan Anda untuk mengatur aturan di sekitar pengaturan Anda. Ini nyaman, fleksibel, dan mudah dirawat, sekaligus menghindari penggunaan gratis untuk semua.

EDIT: Beberapa detail lainnya, termasuk beberapa contoh...

Perhatikan bahwa ERD, di atas, telah ditambah dengan lebih banyak detail kolom (nilai rentang pada SETTING dan kolom pada ALLOWED_SETTING_VALUE).

Berikut adalah beberapa contoh catatan untuk ilustrasi.

SETTING:
+----+------------------+-------------+--------------+-----------+-----------+
| id | description      | constrained | data_type    | min_value | max_value |
+----+------------------+-------------+--------------+-----------+-----------+
| 10 | Favourite Colour | true        | alphanumeric | {null}    | {null}    |
| 11 | Item Max Limit   | false       | integer      | 0         | 9001      |
| 12 | Item Min Limit   | false       | integer      | 0         | 9000      |
+----+------------------+-------------+--------------+-----------+-----------+

ALLOWED_SETTING_VALUE:
+-----+------------+--------------+-----------+
| id  | setting_id | item_value   | caption   |
+-----+------------+--------------+-----------+
| 123 | 10         | #0000FF      | Blue      |
| 124 | 10         | #FFFF00      | Yellow    |
| 125 | 10         | #FF00FF      | Pink      |
+-----+------------+--------------+-----------+

USER_SETTING:
+------+---------+------------+--------------------------+---------------------+
| id   | user_id | setting_id | allowed_setting_value_id | unconstrained_value |
+------+---------+------------+--------------------------+---------------------+
| 5678 | 234     | 10         | 124                      | {null}              |
| 7890 | 234     | 11         | {null}                   | 100                 |
| 8901 | 234     | 12         | {null}                   | 1                   |
+------+---------+------------+--------------------------+---------------------+

Dari tabel-tabel tersebut, kita dapat melihat bahwa beberapa pengaturan pengguna yang dapat ditentukan adalah Warna Favorit, Batas Maks Barang, dan Batas Minimum Barang. Warna Favorit adalah daftar pilihan alfanumerik. Batas minimum dan maksimum item adalah numerik dengan nilai rentang yang diizinkan ditetapkan. SETTING.constrained kolom menentukan apakah pengguna memilih dari ALLOWED_SETTING_VALUE terkait s atau apakah mereka perlu memasukkan USER_SETTING.unconstrained_value . GUI yang memungkinkan pengguna untuk bekerja dengan pengaturan mereka perlu memahami opsi mana yang ditawarkan dan bagaimana menerapkan keduanya SETTING.data_type dan min_value dan max_value batas, jika ada.

Dengan menggunakan desain ini, Anda dapat mengatur pengaturan yang diizinkan termasuk metadata yang cukup untuk menerapkan beberapa batasan dasar/pemeriksaan kewarasan pada nilai yang dipilih (atau dimasukkan) oleh pengguna.

EDIT:Contoh Kueri

Berikut ini beberapa contoh SQL yang menggunakan data di atas untuk mencantumkan nilai setelan untuk ID pengguna yang diberikan:

-- DDL and sample data population...
CREATE TABLE SETTING
    (`id` int, `description` varchar(16)
     , `constrained` varchar(5), `data_type` varchar(12)
     , `min_value` varchar(6) NULL , `max_value` varchar(6) NULL)
;

INSERT INTO SETTING
    (`id`, `description`, `constrained`, `data_type`, `min_value`, `max_value`)
VALUES
    (10, 'Favourite Colour', 'true', 'alphanumeric', NULL, NULL),
    (11, 'Item Max Limit', 'false', 'integer', '0', '9001'),
    (12, 'Item Min Limit', 'false', 'integer', '0', '9000')
;

CREATE TABLE ALLOWED_SETTING_VALUE
    (`id` int, `setting_id` int, `item_value` varchar(7)
     , `caption` varchar(6))
;

INSERT INTO ALLOWED_SETTING_VALUE
    (`id`, `setting_id`, `item_value`, `caption`)
VALUES
    (123, 10, '#0000FF', 'Blue'),
    (124, 10, '#FFFF00', 'Yellow'),
    (125, 10, '#FF00FF', 'Pink')
;

CREATE TABLE USER_SETTING
    (`id` int, `user_id` int, `setting_id` int
     , `allowed_setting_value_id` varchar(6) NULL
     , `unconstrained_value` varchar(6) NULL)
;

INSERT INTO USER_SETTING
    (`id`, `user_id`, `setting_id`, `allowed_setting_value_id`, `unconstrained_value`)
VALUES
    (5678, 234, 10, '124', NULL),
    (7890, 234, 11, NULL, '100'),
    (8901, 234, 12, NULL, '1')
;

Dan sekarang DML untuk mengekstrak pengaturan pengguna:

-- Show settings for a given user
select
  US.user_id 
, S1.description 
, S1.data_type 
, case when S1.constrained = 'true'
  then AV.item_value
  else US.unconstrained_value
  end value
, AV.caption
from USER_SETTING US
  inner join SETTING S1
    on US.setting_id = S1.id 
  left outer join ALLOWED_SETTING_VALUE AV
    on US.allowed_setting_value_id = AV.id
where US.user_id = 234

Lihat ini di SQL Fiddle.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Melewati varchar yang penuh dengan nilai yang dibatasi koma ke fungsi SQL Server IN

  2. SQL Server Karakter Escape Pencarian Teks Lengkap?

  3. SQL Server 2017 Langkah demi Langkah Instalasi -2

  4. Bagaimana cara meneruskan nilai ke parameter prosedur tersimpan di komponen Sumber OLE DB?

  5. TAHUN() Contoh di SQL Server (T-SQL)