2016-02-22 14 views
5

Tôi có một câu hỏi thực tế về các trường bảng đặt tên trong cơ sở dữ liệu. Ví dụ: tôi có hai bảng:Quy ước đặt tên trường bảng và câu lệnh SQL

student (id int; name varchar(30)) 
teacher (id int, s_id int; name varchar(30)) 

Có cả 'id' và "tên" trong hai bảng. Trong câu lệnh SQL, nó sẽ không rõ ràng cho cả hai nếu không có tên bảng nào được đặt trước. Hai lựa chọn:

  1. sử dụng tên bảng là tiền tố của một trường trong SQL 'nơi' khoản
  2. sử dụng tiền tố tên trường trong bảng để không tiền tố sẽ được sử dụng trong 'nơi' khoản.

Cái nào tốt hơn?

Trả lời

2

Đối với các truy vấn mà không phải là ad-hoc, bạn nên luôn prefix mọi lĩnh vực với một trong hai tên bảng hoặc bảng bí danh, ngay cả khi tên trường không rõ ràng. Điều này ngăn chặn truy vấn phá vỡ sau này nếu ai đó thêm cột mới vào một trong các bảng giới thiệu sự mơ hồ.

Vì vậy, điều đó sẽ làm cho "id" và "name" rõ ràng. Nhưng tôi vẫn khuyên bạn nên đặt tên khóa chính với một cái gì đó cụ thể hơn "id". Trong ví dụ của bạn, tôi sẽ sử dụng student_idteacher_id. Điều này giúp ngăn ngừa các lỗi trong các phép nối. Bạn sẽ cần nhiều tên cụ thể hơn khi bạn chạy vào các bảng có nhiều khóa duy nhất hoặc các khóa đa phần.

Thật đáng để suy nghĩ những điều này thông qua, nhưng tính nhất quán cuối cùng có thể là yếu tố quan trọng hơn. Tôi có thể xử lý các bảng được xây dựng quanh id thay vì student_id, nhưng tôi hiện đang làm việc với một lược đồ không phù hợp sử dụng tất cả các mục sau: id, sid, systemid và các tên cụ thể như taskid. Đó là điều tồi tệ nhất của cả hai thế giới.

+1

Có, luôn đủ điều kiện ** tất cả ** tham chiếu cột trong truy vấn. Nó ngăn chặn truy vấn phá vỡ trong tương lai khi ai đó thêm một cột trong một bảng (giới thiệu các lỗi tham chiếu cột mơ hồ). Và, nó làm cho nó dễ dàng hơn cho người đọc sau để giải mã SQL ... mà tham chiếu không đủ tiêu chuẩn của cột 'foobar' ... là tham chiếu đến một cột trong bảng' phí', bảng 'fi' hoặc' fo' bảng? (Bạn không dám làm cho tôi đi săn qua các định nghĩa bảng để tìm hiểu bảng nào đề cập đến.) Nhưng sở thích cá nhân của tôi là đặt tên cho cột là 'id', đó là khóa chính (hoặc duy nhất). – spencer7593

0

Nếu không quá lâu, tôi thích tiền tố trong bảng, ví dụ: teacher.teacher_id, student.student_name. Bằng cách đó, bạn luôn luôn chắc chắn tên hoặc id của bạn đang nói về, ngay cả khi bạn để có được tiền tố tên bảng.

3

Không nghi ngờ gì, hãy chọn tùy chọn 1. Đây là sql hợp lệ trong bất kỳ loại cơ sở dữ liệu nào và được coi là định dạng phù hợp và dễ đọc nhất. Đó là thói quen tốt để tiền tố tên bảng vào một cột và rất cần thiết khi tham gia. Ngoại lệ duy nhất cho điều này tôi thường thấy nhất là tiền tố cột id với tên bảng, nhưng tôi vẫn không làm điều đó.
Nếu bạn đi với tùy chọn 2, DBA dày dạn có lẽ sẽ trỏ và cười bạn.
Để biết thêm bằng chứng, hãy xem # 2 tại đây: https://www.periscopedata.com/blog/better-sql-schema.html
Và tại đây. Quy tắc 1b - http://www.isbe.net/ILDS/pdf/SQL_server_standards.pdf

Như TT đề cập, bạn sẽ làm cho cuộc sống của mình dễ dàng hơn nhiều nếu bạn học cách sử dụng tên alias. Nó đơn giản như sử dụng SomeTableNameThatsWayTooLong as long_table trong truy vấn của bạn, chẳng hạn như:

SELECT LT.Id FROM SomeTableNameThatsWayTooLong AS LT 
+1

Vì vậy, trong trường hợp đó, tôi không nên sử dụng tên trường như "student_ID", "teach_ID", "student_name", "teacher_name", nhưng chỉ "id" và "name" trong cả hai bảng. Đúng? – marlon

+0

Trong cơ sở dữ liệu nào một cột được gọi là "student_id" dẫn đến SQL không hợp lệ? – Bampfer

+0

Tôi không nói nó sẽ dẫn đến SQL không hợp lệ. Tôi nói rằng chỉ cần sử dụng 'id' hoặc 'name' là luôn hợp lệ miễn là bạn đủ điều kiện với tên bảng. Đặt tên cho mỗi cột student_id, student_name, student_dorm, student_major, v.v. sẽ khiến các nhà phát triển của bạn phát điên và không cần thiết. – Ageonix

2

Tôi sẽ sử dụng bí danh thay vì tên bảng.

Bạn có thể gán alias vào bảng trong truy vấn, một bảng ngắn hơn tên bảng. Điều đó làm cho truy vấn dễ đọc hơn nhiều.Ví dụ:

SELECT 
    t.name AS teacher_name, 
    s.name AS student_name 
FROM 
    teacher AS t 
    INNER JOIN student AS s ON 
     s.id=t.s_id; 

Bạn có thể sử dụng tất nhiên tên bảng nếu bạn không sử dụng bí danh, và đó sẽ được ưa thích hơn lựa chọn của bạn 2.

+2

Cá nhân, tôi muốn cột khóa ngoài được đặt tên theo mẫu ** 'referenced_table_id'. ** Ví dụ:' student_id', thay vì 's_id'. Bên cạnh đó, đây là mô hình tôi làm theo. – spencer7593

+1

Cuộc gọi tốt về đề cập đến bí danh '. DBA của chúng tôi sử dụng tên dài điên và gõ ra StudentClassListDetails trước khi mỗi cột được tẻ nhạt. Cú pháp này phụ thuộc vào kiểu cơ sở dữ liệu, nhưng tôi nghĩ hầu hết chúng đều đơn giản như 'StudentClassListDetails như scld' – Ageonix

+1

@ spencer7593 Điểm tốt, có tên rõ ràng là quan trọng để tránh nhầm lẫn trong cơ sở dữ liệu lớn với nhiều bảng có liên quan. –