2008-11-27 36 views
10

Tôi bây giờ đến thời điểm này của dự án của tôi mà tôi cần phải thiết kế cơ sở dữ liệu của tôi (Oracle). Thông thường đối với các bảng trạng và nước tôi không sử dụng một khóa chính số, ví dụSố VS Varchar (2) Các khóa chính

STATUS (max 6) 
AC --> Active 
DE --> Deleted 

COUNTRIES (total 30) 
UK --> United Kingdom 
IT --> Italy 
GR --> Greece 

Các bảng này được tĩnh, không được cập nhật thông qua ứng dụng và nó không lường trước được sự thay đổi trong tương lai để có không có cơ hội có vấn đề cập nhật trong bảng sẽ sử dụng các giá trị này như là khóa ngoài.

Bảng chính của ứng dụng sẽ sử dụng vị thế và nước (nhiều hơn một lần ví dụ như nước xuất xứ, quốc gia đến) và nó được dự kiến ​​rằng 600000 hàng sẽ được bổ sung mỗi năm

Vì vậy, câu hỏi của tôi là, sẽ những VARCHAR (2) phím sẽ có tác động trong hiệu suất khi truy vấn tham gia có 3 bảng. Đầu tiên có chậm hơn đáng kể so với giây không?

SELECT m.*, 
     s.status_name, 
     c.country_name 
    FROM main m, status s, countries c 
WHERE m.status_cd = s.status_cd 
    AND m.country_cd = c.country_cd 
    AND m.status_cd = 'AC' 
    AND m.country_cd = 'UK' 

SELECT m.*, 
     s.status_name, 
     c.country_name 
    FROM main m, status s, countries c 
WHERE m.status_cd = s.status_cd 
    AND m.country_cd = c.country_cd 
    AND m.status_cd = 1 
    AND m.country_cd = 2 

Làm rõ:

Tình trạng không phải là nhị phân ("max 6" bên cạnh tên bảng). Các giá trị có thể là:

* active 
* deleted 
* draft 
* send 
* replaced 

và chúng tôi cần hiển thị giá trị được giải mã cho người dùng, vì vậy chúng tôi cần tên.

+1

Bạn đang sử dụng VARCHAR2 trong Oracle, hoặc VARCHAR (2)? Nếu sử dụng Oracle VARCHAR2, thì các dấu ngoặc đơn sẽ gây hiểu nhầm. Nếu VARCHAR (2), thì tại sao không CHAR (2) thường hiệu quả hơn. –

Trả lời

0

Nếu 'trạng thái' là (và sẽ luôn luôn là?) Trường hoạt động nhị phân/đã xóa tại sao phải bận tâm với bảng. Nó có vẻ như bình thường hóa đưa đến một cực đoan không thực tế.

Nó sẽ chắc chắn được nhanh hơn, chưa kể đến dễ dàng hơn, chỉ cần sử dụng một (1) lĩnh vực tinyint và ghi lại các hoạt động tiểu bang/xóa như một 1 hoặc 0.

này giúp loại bỏ một trong những tham gia của bạn hoàn toàn điều đó phải là một điều tốt.

+0

Vì câu hỏi cho biết có 6 mã trạng thái, đây không phải là trường nhị phân. –

2

Kiểm tra điều này link. Điểm mấu chốt là không có nhiều hiệu suất khác biệt giữa varchar và num. Vì vậy, bạn nên đi cho có bao giờ làm cho tinh thần cho cột. Ở đây, VARCHAR dường như có ý nghĩa hơn.

0

Không quan trọng bạn chọn loại methode nào trong trường hợp này. Phần quan trọng là sử dụng cùng loại trong toàn bộ cơ sở dữ liệu và nhất quán trong quy ước id của bạn.

5

Cả bảng trạng thái và quốc gia quá nhỏ nên chúng sẽ là bộ nhớ cư trú trong thực tế, cho dù chính thức được nêu như vậy hay không. Thật vậy, ngoại trừ một khóa ngoại thường yêu cầu một chỉ mục trên trường khóa chính được tham chiếu, bạn có thể bị cám dỗ không làm phiền với bất kỳ chỉ mục nào trên các bảng.

Sự khác biệt hiệu suất giữa các kết nối với các loại khác nhau sẽ không đáng kể và mã số sẽ chậm hơn vì có nhiều dữ liệu hơn để lưu trữ (nhưng nó quá nhỏ đến mức không đáng kể, lần nữa).

Vì vậy, hãy đi với mã tự nhiên. Ngoài ra, SQL trong ví dụ đầu tiên rõ ràng hơn; 'UK' và 'AC' có ý nghĩa hơn 1 và 2.

Trong DBMS không phải Oracle, bạn có thể sử dụng CHAR (2) cho cả giá trị trạng thái và mã quốc gia.Người dùng Oracle có xu hướng sử dụng VARCHAR2 cho mọi thứ; Tôi không chắc liệu có một hình phạt cho việc sử dụng một cột CHAR (2) thay vào đó, đặc biệt là vì các giá trị cột có độ dài cố định. (Theo Informix, ví dụ, một trường VARCHAR (2) - một trường có tối đa hai ký tự - sẽ lưu trữ dưới dạng 3 byte, độ dài (luôn luôn là 2 trong trường hợp của bạn) và 2 byte dữ liệu. Ngược lại, một CHAR (2)) sẽ chỉ chiếm 2 byte.)

+2

Trong Oracle, một trường CHAR và VARCHAR được lưu trữ trên đĩa chính xác giống hệt nhau - ngoại trừ trường CHAR được buộc phải đệm không gian theo chiều dài được chỉ định. – Dracorat

Các vấn đề liên quan