Bảng liên tục của thế giới - đây có phải là thông lệ không?


8

Lớp SQL đại học, sử dụng cuốn sách "Nguyên tắc cơ bản SQL" của John J. Patrick. Trong chương thứ ba, anh nói về việc sử dụng "bảng hằng số" để thêm các cột vào một câu lệnh chọn, trong đó tất cả các hàng có cùng giá trị.

Ví dụ: nếu bạn có bảng "ký tự", như vậy:

first_name  last_name  dept_code
----------- ---------- -------------------
Fred        Flintstone ROCKS
Barney      Rubble     ROCKS
Wilma       Flintstone FACEPALMING_AT_FRED

và bạn muốn một CHỌN thêm một cột "quê hương" có giá trị "BEDROCK" cho tất cả các hàng, anh ấy khuyên bạn nên tạo một bảng thứ hai trong cơ sở dữ liệu, "temp", với

hometown
--------
BEDROCK

và sau đó làm

SELECT first_name, last_name, dept_code, hometown FROM characters, temp

Ý tưởng là điều này tránh đặt các hằng chuỗi trong câu lệnh CHỌN và nếu bạn có nhiều CHỌN cần các hằng số giống nhau, thì việc cập nhật một bảng sẽ dễ dàng hơn so với năm mươi truy vấn.

Vấn đề là, tôi đã làm việc với các cơ sở dữ liệu SQL trong mười lăm năm qua và tôi chưa bao giờ thấy công trình này. Đó có phải là thứ gì đó hoàn toàn phổ biến mà tôi vừa bỏ lỡ, hay nó là thứ gì đó mà tôi có thể xóa khỏi bộ nhớ của mình sau khi nhiệm vụ này kết thúc?

Câu trả lời:


9

Joe Celko đề cập đến các bảng hằng số trong một vài cuốn sách của mình.

Ông đề nghị nếu sử dụng một bảng mà một ràng buộc kiểm tra được thêm vào để đảm bảo bảng có thể chứa không quá một hàng.

CREATE TABLE Constants
(
lock CHAR(1) DEFAULT 'X' NOT NULL PRIMARY KEY CHECK (lock = 'X'),
pi FLOAT DEFAULT 3.142592653 NOT NULL,
e FLOAT DEFAULT 2.71828182 NOT NULL,
phi FLOAT DEFAULT 1.6180339887 NOT NULL
);

Hoặc cách khác, một khung nhìn có thể được sử dụng cho mục đích tương tự.

CREATE VIEW Constants
AS
SELECT *
FROM 
(VALUES(3.142592653,
        2.71828182,
        1.6180339887)) V(pi,e,phi)

Không phải thứ gì đó tôi đã sử dụng nhiều, nếu có, bản thân tôi nhưng luôn đáng để có các kỹ thuật bổ sung có thể xem xét.

Trường hợp sử dụng cụ thể trong câu hỏi của bạn không phải là thứ tôi sẽ xem xét một bảng các hằng số. TBH cùng một "quê hương" được mã hóa cứng đối với mọi người dường như là một yêu cầu vô nghĩa.


2
Các giải pháp xem là khá tốt đẹp. Nó cũng bảo vệ một lần nữa những thay đổi tình cờ đối với "hằng số".
a_horse_with_no_name

Điều này có vẻ như là một loại hằng số khác nhiều so với OP được đăng, mặc dù. Đây là các giá trị độc lập, bất biến ứng dụng. Ví dụ của OP là dữ liệu phụ thuộc vào ứng dụng, một số trong đó tôi dự kiến ​​sẽ thay đổi theo thời gian. Tôi không rõ tại sao "quê hương" sẽ được coi là không đổi.
Mike Sherrill 'Nhớ lại mèo'

@Catcall - Đồng ý rằng có vẻ là một ví dụ xấu. Cũng như những điều mà thực sự liên tục này có thể cũng được sử dụng cho các biến toàn cầu mặc dù. Đã suy nghĩ về thuế suất nhưng có lẽ trong thế giới thực sẽ muốn giữ tỷ lệ lịch sử cho việc này. Có thể có thể được sử dụng nếu triển khai cùng một cơ sở dữ liệu cho nhiều khách hàng cho một số dữ liệu tùy chỉnh.
Martin Smith

1
Tôi lấy ví dụ đó trực tiếp ra khỏi không khí mỏng. Điều này có thể giúp giải thích tính xấu. Cuốn sách trong cuốn sách đang thêm "last_eval_date" vào một loạt các hồ sơ nhân viên ... Tôi vẫn sẽ không làm theo cách đó, nhưng có lẽ tốt hơn.
mjfgates

3

Theo kinh nghiệm của tôi, tôi hiếm khi phát triển mã trong đó hằng số chuỗi được thêm vào tập kết quả. Giải pháp đề xuất không có ý nghĩa với tôi. Tôi sẽ rất nghi ngờ về chất lượng mã của một hệ thống đã làm điều này. Nhìn vào ví dụ này tôi sẽ viết mã như sau.

first_name  last_name  dept_code
----------- ---------- ---------
Fred        Flintstone 1
Barney      Rubble     1
Wilma       Flintstone 2

dept_code dept_name
--------- -------------------
1         ROCKS
2         FACEPALMING_AT_FRED

SELECT first_name, last_name, dept_name, 'BEDROCK' AS hometown
FROM characters c 
JOIN departments d ON (c.dept_code = d.dept_code )

Tôi sẽ quên cách tiếp cận của anh ấy sau bài tập này. Để nó hoạt động, bạn sẽ cần một bảng hoặc cột cho mỗi hằng số hoặc một bản cập nhật trước mỗi truy vấn. Tôi hy vọng một lúc nào đó một bảng địa chỉ sẽ được thêm vào từ đó quê hương có thể được chọn bằng cách sử dụng một phép nối thích hợp.


2

Nếu tôi cần một hằng số, thì tôi sẽ xem xét một UDF vô hướng đơn giản (SQL Server, nhưng các RDBMS khác có cùng). Tôi đã thực hiện điều này để ghi lại "số ma thuật" và chuỗi CR / LF và như vậy, nếu hoàn cảnh yêu cầu điều này phải có trong cơ sở dữ liệu

Một ví dụ từ SO: https://stackoverflow.com/a/2947405/27535

Ví dụ bạn đưa ra có vẻ hơi vô nghĩa. Nếu không đổi, tại sao thêm nó vào một tập kết quả? Trừ khi nó là một giá trị thay thế NULL hoặc như vậy.


Tôi có thể hiểu ... nhưng cuốn sách này rõ ràng ủng hộ các bảng một hàng, với một hằng số duy nhất trong mỗi trường, chính xác để bạn có thể thêm các hằng số vào tập kết quả. Do đó, wtf? trong câu hỏi ban đầu :)
mjfgates
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.