การใช้ชื่อแทนตารางเป็นแนวทางปฏิบัติที่ไม่ดี


21

ฉันจำได้ว่าเรียนรู้ที่จะทำสิ่งนี้ในหลักสูตร DBMS สำหรับนักเรียนปริญญาโทสาขาบริการข้อมูล ในการช่วยตัวเองให้พิมพ์คุณสามารถพิมพ์:

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

แต่ ... ทำไมจึงเป็นที่ยอมรับในขั้นตอนการจัดเก็บและเช่นนี้? ดูเหมือนว่าทั้งหมดจะเป็นอันตรายต่อความสามารถในการอ่านของคำสั่งในขณะที่ประหยัดเวลาน้อยมาก มีเหตุผลการทำงานหรือเหตุผลในการทำเช่นนี้? ดูเหมือนว่าจะเพิ่มความกำกวมมากกว่าลบออก; เหตุผลที่ยอมรับได้เพียงอย่างเดียวที่ฉันเห็นสำหรับการใช้รูปแบบนี้คือถ้าคุณเพิ่มนามแฝงที่มีความหมายเชิงความหมาย - ตัวอย่างเช่นFROM someTable idsTable- เมื่อชื่อตารางไม่อธิบายเพียงพอ

การใช้ชื่อแทนตารางเป็นวิธีปฏิบัติที่ไม่ดีหรือเป็นเพียงการใช้ระบบที่เป็นประโยชน์ในทางที่ผิด


8
เมื่อคุณเขียน SQL สองสามบรรทัดคุณจะประทับใจกับการพิมพ์ที่บันทึกไว้ นี่เป็นกรณีที่คุณสามารถซื้อผลิตผลเพิ่มขึ้นด้วยค่าใช้จ่ายเพียงเล็กน้อยหรือไม่มีค่าใช้จ่ายในการบำรุงรักษา
Jon of All Trades

6
แบบสอบถามส่วนใหญ่ที่ฉันเขียนซึ่งเริ่มต้นด้วยหนึ่งตารางในที่สุดก็ขยายรวมตารางเพิ่มเติม ("นี่ยอดเยี่ยม แต่คุณสามารถเพิ่ม Foo ได้ไหม") การกำหนดชื่อทุกคอลัมน์ไว้ด้านหน้าจะทำให้ชีวิตของคุณง่ายขึ้น
billinkc

สิ่งที่ดีอย่างเดียวที่ฉันเห็นเกี่ยวกับการใช้นามแฝงของตารางทั้งหมดในแบบสอบถามทั้งหมดคือบางครั้งผู้พัฒนาโฆษณาก็สามารถใส่คำที่หยาบคายลงในโค้ดได้!
NeedHack

ทำไมไม่เป็นเช่นนั้นselect id, stuff from someTable natural join otherTable?
โคลิน 'T ฮาร์ท

คำตอบ:


39

การใช้ชื่อแทนตารางเป็นวิธีปฏิบัติทั่วไปและเป็นประโยชน์

  • มันช่วยให้คุณกดแป้นเมื่ออ้างอิงคอลัมน์ที่ใดก็ได้ในแบบสอบถามของคุณ
  • มันช่วยเพิ่มความสามารถในการอ่านของ SQL ของคุณเมื่อคุณอ้างอิงหลายตาราง นามแฝงช่วยให้คุณตั้งชื่อย่อให้กับตารางเหล่านั้นพร้อมความหมายเล็กน้อยกับวิธีการใช้งาน
  • จำเป็นต้องมีแม้กระทั่งเมื่อคุณเข้าร่วมตารางกับตัวเองหรือเมื่อคุณเข้าร่วมในตารางเดียวกันหลายครั้ง นี่คือเพื่อให้เครื่องมือเพิ่มประสิทธิภาพแบบสอบถามรู้ตารางที่คุณอ้างอิงเมื่อคุณพูดถึงคอลัมน์

สารสกัดรายงานต่อไปนี้แสดงให้เห็นถึงทุกจุดดังกล่าวอย่าง:

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
นามแฝงสามารถอ่านได้มากขึ้นสำหรับผู้ที่เขียนและอ่าน SQL จำนวนมาก พวกเขาไม่สามารถอ่านได้สำหรับผู้พัฒนาฐานข้อมูลใหม่ แต่ฉันคิดว่ามันเป็นอุปสรรคที่พวกเขาต้องล้างไม่ช้าก็เร็ว
Mike Sherrill 'Cat Recall'

7
ฉันแนะนำนามแฝงที่มีความหมายอย่างเต็มที่ เป็นเรื่องที่ดีมากที่ได้เห็นตัวอย่างที่มีนามแฝงที่มีความหมายแทน t1, t2 ... หรือ a, b, b, c, d, e .... มันอาจสร้างความสับสนได้เมื่อคุณได้นามแฝงเช่นพนักงาน a, ที่อยู่ b , บัญชี c, การเรียกเก็บเงิน d, ลูกค้า e.
BillThor

4
ฉันคิดว่ามันเป็นสิ่งสำคัญเช่นกันที่จะใช้ชื่อแทนในทุกคอลัมน์ที่อ้างอิงเพื่อให้การดูแลรักษาง่ายขึ้นเช่นกัน แน่ใจว่ามีเพียงหนึ่งตารางเท่านั้นที่มีเขตข้อมูลชื่อ xyzjunk แต่อันไหน? เมื่อคุณเขียนคิวรีการรายงานที่ซับซ้อนจะเป็นประโยชน์เมื่อคุณทราบว่าฟิลด์ของคุณมาจากไหน
HLGEM

1
มันเป็นสิ่งจำเป็นเช่นกันเมื่อคุณเข้าร่วมกับตารางที่ได้รับเช่นกัน
HLGEM

@HLGEM - ทั้งคะแนนยอดเยี่ยม
Nick Chammas

12

ฉันคิดว่าการใช้นามแฝงช่วยให้สามารถอ่านข้อความค้นหาได้หากชื่อตารางยาวหรือคล้ายกันมากจนบางคนอ่านเร็วอาจทำให้เข้าใจผิด คุณคิดว่านี่ ...

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' 

สามารถอ่านได้มากกว่านี้?

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' 

ขึ้นอยู่กับสิ่งที่คุณใช้เป็นนามแฝงของตารางสามารถทำให้แบบสอบถามง่ายขึ้นมากสำหรับบุคคลที่จะอ่านและทำความเข้าใจ


2
ฉันต้องการตามล่าและฆ่านักพัฒนาที่ไม่ได้ใช้นามแฝงในตารางของพวกเขา ตัวอย่างแรกนั้นทำให้ตาของฉันมีเลือดออก และอย่างใดเมื่อพวกเขาทำสิ่งนี้พวกเขาไม่ได้สร้างรหัสของพวกเขาเพื่อให้ฉันสามารถดูได้โดยไม่ต้องเลื่อนเกินไป (เช่นเดียวกับที่คุณทำ)
HLGEM

5

การใช้ชื่อแทนตาราง (เพื่อประโยชน์ของชื่อตารางที่สั้นกว่า) ไม่ใช่วิธีปฏิบัติที่ไม่ถูกต้อง

ปกติฉันจะใช้มันเมื่อ tablenames ยาวแล้วใช้นามแฝงที่เหมาะสมเท่านั้น:

SELECT tTable.stuff FROM track_table tTable;

หากคุณต้องการปรับปรุงการอ่านคุณสามารถใช้ASคำหลัก:

SELECT tTable.stuff FROM track_table AS tTable;

แต่เมื่อคุณคุ้นเคยกับไวยากรณ์แล้วมันไม่จำเป็น


0

คุณสามารถใช้สิ่งนี้เพื่อเพิ่มความสามารถในการอ่านของแบบสอบถามอย่างมีนัยสำคัญ แทนที่จะใช้นามแฝงสั้น ๆ ใช้นามแฝงของคุณเพื่ออธิบายข้อมูลที่คุณกำลังเข้าร่วมตัวอย่างเช่น

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

ในขณะที่ใช้นามแฝงที่สั้นมาก (เช่นaหรือt1) สามารถสร้างคิวรีที่ยากต่อการอ่านในขณะที่คุณต้องการค้นหานามแฝงเพื่อค้นหาว่านามแฝงหมายถึงอะไร ชื่อ


-1

นี่เป็นคำถามเกี่ยวกับ "การปฏิบัติที่ไม่ดี" คำตอบดูเหมือนจะเกี่ยวกับ "การบันทึกการกดแป้น"

โดยส่วนตัวความเร็วการเข้ารหัสของฉันถูก จำกัด ด้วยความเร็วความคิดของฉันไม่ใช่ความเร็วการพิมพ์ของฉัน ฉันค้นหารหัสที่มีชื่อแทนตารางจำนวนมากยากต่อการอ่านมากกว่ารหัสที่ใช้ชื่อตารางเอง นามแฝงตารางเพิ่มอีกระดับของการอ้อม

อย่างไรก็ตามโปรแกรมเมอร์ส่วนใหญ่จะใช้ชื่อแทนตาราง (แม้ว่าฉันจะไม่ได้) "สภาพแวดล้อมการพัฒนา SQL" บางอย่างทำให้ง่ายมากและครูบางคนสอนนามแฝงของตารางโดยอัตโนมัติโดยเฉพาะอย่างยิ่งเป็นส่วนหนึ่งของการเรียนรู้ไวยากรณ์ "เข้าร่วม"

การใช้ชื่อแทนตารางไม่ใช่วิธีปฏิบัติที่ไม่ดี แต่บางครั้งฉันต้องอ่านโค้ดและแทนที่ชื่อแทนด้วยชื่อตารางดั้งเดิมเพื่อที่จะเข้าใจสิ่งที่เกิดขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.