Là bí danh bảng là một thực hành xấu?


21

Tôi nhớ việc học để làm điều này trong một khóa học DBMS dành cho sinh viên Thạc sĩ Dịch vụ Thông tin. Để tiết kiệm cho bạn một số gõ, bạn có thể gõ:

SELECT t1.id, t2.stuff 
FROM 
              someTable    t1 
   INNER JOIN otherTable   t2 
      ON t1.id=t2.id
;

Nhưng ... Tại sao điều này được chấp nhận trong các thủ tục lưu trữ và như vậy? Có vẻ như tất cả những gì nó làm là làm hại tính dễ đọc của câu lệnh trong khi tiết kiệm một lượng thời gian cực kỳ nhỏ. Có bất kỳ lý do chức năng hoặc logic để làm điều này? Nó dường như thêm sự mơ hồ hơn là loại bỏ nó; lý do duy nhất có thể chấp nhận mà tôi có thể thấy khi sử dụng định dạng này là nếu bạn thêm một bí danh có ý nghĩa về mặt ngữ nghĩa - ví dụ FROM someTable idsTable- khi tên bảng không đủ mô tả.

Là bí danh bảng là một thực hành xấu hay đây chỉ là một sự lạm dụng của một hệ thống hữu ích?


8
Khi bạn đã viết một vài nghìn dòng SQL, bạn sẽ đánh giá cao cách gõ đã lưu. Đây là một trường hợp, được sử dụng cẩn thận, bạn có thể mua năng suất tăng ít hoặc không mất chi phí bảo trì.
Jon của tất cả các giao dịch

6
Hầu hết mọi truy vấn tôi đã viết bắt đầu bằng một bảng cuối cùng đã phát triển để bao gồm nhiều bảng hơn ("Điều này thật tuyệt, nhưng bạn có thể thêm Foo không?"). Bí danh mỗi cột lên phía trước sẽ đơn giản hóa cuộc sống của bạn.
billinkc

Điều tốt duy nhất tôi có thể thấy về cách thực hành rất phổ biến này về bí danh tất cả các bảng trong tất cả các truy vấn là đôi khi một nhà phát triển sáng tạo quản lý để trượt một từ nghịch ngợm vào mã!
NeedHack

Tại sao không chỉ select id, stuff from someTable natural join otherTable?
Colin 't Hart

Câu trả lời:


39

Bí danh bảng là một thực hành phổ biến và hữu ích.

  • Nó giúp bạn tiết kiệm tổ hợp phím khi tham chiếu các cột ở bất cứ đâu trong truy vấn của bạn.
  • Nó cải thiện khả năng đọc SQL của bạn khi bạn tham khảo nhiều bảng. Bí danh cho phép bạn đặt cho các bảng đó một tên ngắn cộng với một chút ý nghĩa đối với cách chúng đang được sử dụng.
  • Nó thậm chí được yêu cầu khi bạn tham gia một bảng vào chính nó hoặc khi bạn tham gia vào cùng một bảng nhiều lần. Điều này là để trình tối ưu hóa truy vấn biết bạn đang tham chiếu bảng nào khi bạn đề cập đến một cột.

Các trích xuất báo cáo sau đây minh họa tất cả các điểm trên độc đáo:

INSERT INTO reporting.txns_extract
SELECT 
    -- 30+ columns snipped
    -- 
    -- Would you want to type out full table names for each 
    -- column here?
FROM 
    -- ... and in the JOIN conditions here?
                billing.financial_transactions  ft_cdi   -- alias required here
    INNER JOIN  
                billing.cash_application_links  cal
            ON  ft_cdi.key_num = cal.applied_ft_key_num
    INNER JOIN  
                billing.financial_transactions  ft_pmt   -- alias required here
            ON  cal.owner_key_num = ft_pmt.key_num
    LEFT OUTER JOIN
                billing.invoice_lines           invl
            ON  ft_cdi.key_num = invl.invoice_key_num
    LEFT OUTER JOIN
                billing.charges                 chrg
            ON  invl.creator_key_num = chrg.key_num
    LEFT OUTER JOIN
                billing.customer_services       cs
            ON  chrg.cs_key_num = cs.key_num
    INNER JOIN
                billing.billers                 bil
            ON  ft_cdi.biller_account_key_num = bil.biller_account_key_num
    INNER JOIN
                billing.formal_entities         fe
            ON  bil.frml_key_num = fe.key_num
WHERE
    -- ... and in the WHERE conditions here?
        ft_cdi.transaction_type <> 'Payment'   -- alias tells me this table is not for payments
    AND ft_cdi.status = 'Approved'
    AND ft_pmt.transaction_type =  'Payment'   -- alias tells me this table is for payments
    AND ft_pmt.status = 'Approved'
    AND ft_cdi.last_user_date >   ft_last_user_date_begin
    AND ft_cdi.last_user_date <=  ft_last_user_date_end
;

2
Bí danh dễ đọc hơn đối với những người đã viết và đọc nhiều SQL. Chúng ít được đọc hơn đối với các nhà phát triển cơ sở dữ liệu mới, nhưng tôi nghĩ đó là một trở ngại mà họ phải sớm xóa đi.
Mike Sherrill 'Nhớ lại mèo'

7
Tôi chân thành đề nghị bí danh có ý nghĩa. Thật tuyệt khi thấy một ví dụ với các bí danh có ý nghĩa thay vì t1, t2 ... hoặc a, b, b, c, d, e .... Nó có thể thực sự khó hiểu khi bạn có các bí danh như nhân viên a, địa chỉ b , tài khoản c, thanh toán d, khách hàng e.
BillThor

4
Tôi nghĩ rằng điều quan trọng nữa là sử dụng bí danh trên mỗi cột giới thiệu để dễ bảo trì hơn. Chắc chắn chỉ có một bảng có trường có tên xyzjunk, nhưng cái nào? Khi bạn viết các truy vấn báo cáo phức tạp, sẽ rất hữu ích khi luôn biết trường của bạn xuất hiện ở đâu.
HLGEM

1
Nó cũng được yêu cầu khi bạn tham gia vào một bảng dẫn xuất là tốt.
HLGEM

@HLGEM - Cả hai điểm xuất sắc.
Nick Chammas

12

Tôi nghĩ rằng việc sử dụng các bí danh sẽ giúp khả năng đọc của một truy vấn nếu các tên bảng dài hoặc quá giống nhau mà ai đó đọc nó có thể nhanh chóng nhầm lẫn chúng. Bạn có nghĩ rằng điều này ...

SELECT Really_long_table_name.ID,
       Even_longer_table_name_than_before.Name,
       Even_longer_table_name_than_before.Description,
       Even_longer_table_name_than_before.State
FROM   Really_long_table_name
       INNER JOIN Even_longer_table_name_than_before
               ON Really_long_table_name.ID = Even_longer_table_name_than_before.ID
WHERE  Really_long_table_name.Department = 'Whatever' 

dễ đọc hơn cái này?

SELECT a.ID,
       b.Name,
       b.Description,
       b.State
FROM   Really_long_table_name a
       INNER JOIN Even_longer_table_name_than_before b
               ON a.ID = b.ID
WHERE  a.Department = 'Whatever' 

Tùy thuộc vào những gì bạn sử dụng làm bí danh bảng, nó có thể làm cho truy vấn đơn giản hơn nhiều đối với một người để đọc và hiểu.


2
Tôi luôn muốn săn lùng và tiêu diệt các nhà phát triển không bí danh các bảng của họ (cũng không theo nghĩa đen). Đó là ví dụ đầu tiên khiến mắt tôi chảy máu. Và bằng cách nào đó khi họ làm điều này họ không tạo mã của họ để tôi có thể xem nó mà không cần cuộn quá (giống như bạn đã làm).
HLGEM

5

Bí danh bảng (vì lợi ích của tên bảng ngắn hơn) không phải là thông lệ xấu.

Tôi thường sử dụng nó khi các tablename dài và sau đó chỉ sử dụng bí danh có ý nghĩa:

SELECT tTable.stuff FROM track_table tTable;

Nếu bạn muốn cải thiện khả năng đọc, bạn có thể sử dụng AStừ khóa:

SELECT tTable.stuff FROM track_table AS tTable;

Nhưng, khi bạn đã quen với cú pháp, nó không cần thiết.


0

Bạn có thể sử dụng điều này để tăng đáng kể khả năng đọc các truy vấn của bạn. Thay vì sử dụng một bí danh ngắn, hãy sử dụng bí danh của bạn để mô tả dữ liệu mà bạn đang tham gia, ví dụ

SELECT
    transaction.unique_id,
    authorisingUser.name AS authorising_user_name,
    requestingUser.name AS requesting_user_name
FROM transactions AS transaction
JOIN users AS authorisingUser
    ON authorisingUser.user_id = txn.authorising_user_id
JOIN users AS requestingUser
    ON requestingUser.user_id = txn.request_user_id

Mặc dù sử dụng các bí danh cực ngắn (như ahoặc t1) có thể khiến một truy vấn khó đọc khi bạn cần tìm và tìm bí danh để tìm hiểu ý nghĩa của bí danh, một bí danh có tên thường có thể khiến truy vấn dễ đọc hơn là chỉ sử dụng bảng tên.


-1

Đây là một câu hỏi về "thực hành xấu". Các câu trả lời dường như là về "Lưu tổ hợp phím".

Cá nhân, tốc độ mã hóa của tôi bị giới hạn bởi tốc độ suy nghĩ của tôi, không phải bởi tốc độ gõ của tôi. Tôi tìm thấy mã có nhiều bí danh bảng khó đọc hơn nhiều so với mã sử dụng chính tên bảng. Các bí danh bảng thêm một mức độ gián tiếp.

Tuy nhiên, hầu hết các lập trình viên đều sử dụng bí danh bảng (mặc dù tôi không). Một số "môi trường phát triển SQL" làm cho việc này rất dễ thực hiện và một số giáo viên dạy bí danh bảng tự động, đặc biệt là một phần của việc học cú pháp "Tham gia".

Sử dụng bí danh bảng không phải là thực tiễn xấu, nhưng đôi khi tôi phải duyệt mã và thay thế các bí danh bằng tên bảng gốc để hiểu điều gì đang xảy ra.

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.