Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Thiết kế cơ sở dữ liệu cho cài đặt người dùng

Các câu trả lời khác đã chỉ ra những ưu và nhược điểm của các tùy chọn khác nhau của bạn.

Tôi tin rằng Tùy chọn 1 của bạn (túi đựng tài sản) là thiết kế tổng thể tốt nhất cho hầu hết các ứng dụng, đặc biệt nếu bạn xây dựng một số biện pháp bảo vệ chống lại những điểm yếu của túi đựng tài sản.

Xem ERD sau:

Trong ERD ở trên, USER_SETTING bảng rất giống với của OP. Sự khác biệt là thay vì varchar CodeValue , thiết kế này có từ FK đến SETTING bảng xác định cài đặt cho phép (Mã) và hai cột loại trừ lẫn nhau cho giá trị. Một tùy chọn là trường varchar có thể nhận bất kỳ loại đầu vào nào của người dùng, tùy chọn còn lại là FK cho một bảng giá trị pháp lý.

SETTING bảng cũng có một cờ cho biết liệu cài đặt người dùng nên được xác định bởi FK hay bởi đầu vào varchar không bị giới hạn. Bạn cũng có thể thêm data_type vào SETTING để cho hệ thống biết cách mã hóa và diễn giải USER_SETTING.unconstrained_value . Nếu muốn, bạn cũng có thể thêm SETTING_GROUP bảng để giúp tổ chức các cài đặt khác nhau để bảo trì người dùng.

Thiết kế này cho phép bạn định hướng các quy tắc xung quanh cài đặt của bạn là gì. Điều này thuận tiện, linh hoạt và dễ bảo trì, đồng thời tránh được tình trạng miễn phí.

CHỈNH SỬA: Thêm một số chi tiết, bao gồm một số ví dụ ...

Lưu ý rằng ERD ở trên đã được tăng cường với nhiều chi tiết cột hơn (phạm vi giá trị trên SETTING và cột trên ALLOWED_SETTING_VALUE).

Dưới đây là một số bản ghi mẫu để minh họa.

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                   |
+------+---------+------------+--------------------------+---------------------+

Từ các bảng này, chúng ta có thể thấy rằng một số cài đặt người dùng có thể được xác định là Màu ưa thích, Giới hạn tối đa của mặt hàng và Giới hạn tối thiểu của mặt hàng. Màu ưa thích là một danh sách chọn các chữ và số. Giới hạn tối thiểu và tối đa của mặt hàng là các số có đặt giá trị phạm vi cho phép. SETTING.constrained cột xác định xem người dùng có đang chọn từ ALLOWED_SETTING_VALUE có liên quan hay không hoặc liệu họ có cần nhập USER_SETTING.unconstrained_value hay không . GUI cho phép người dùng làm việc với cài đặt của họ cần phải hiểu tùy chọn nào sẽ cung cấp và cách thực thi cả SETTING.data_typemin_valuemax_value giới hạn, nếu chúng tồn tại.

Sử dụng thiết kế này, bạn có thể lập bảng điều khiển các cài đặt được phép bao gồm đủ siêu dữ liệu để thực thi một số ràng buộc / kiểm tra độ thông minh thô sơ đối với các giá trị được người dùng chọn (hoặc nhập).

CHỈNH SỬA:Truy vấn mẫu

Dưới đây là một số mẫu SQL sử dụng dữ liệu trên để liệt kê các giá trị cài đặt cho một ID người dùng nhất định:

-- 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')
;

Và bây giờ DML để trích xuất cài đặt của người dùng:

-- 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

Xem điều này trong 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. Làm cách nào để bạn loại bỏ tất cả các kết nối hiện tại đến cơ sở dữ liệu SQL Server 2005?

  2. Cài đặt SQL Server 2017

  3. Quản lý tệp MDF trong SQL Server 2019

  4. Tự động hóa khôi phục kiểm tra cơ sở dữ liệu trong SQL Server

  5. Định dạng số điện thoại trong SQL Server (T-SQL)