2011-01-27 24 views
6

Chúng tôi có hồ sơ chính cho phép người dùng nhập ghi chú. Có 18 trường "ghi chú" riêng lẻ cho mỗi bản ghi chính.SQL Server: Tốt hơn để sử dụng varchar (MAX) hoặc giữ một bảng ghi chú riêng biệt và INNER JOIN nó?

Hiện tại chúng tôi đã chuẩn hóa nó thành một bảng khác được gọi là ghi chú, với cột ID nước ngoài và cột đơn (8000), sau đó chúng tôi chỉ INNER JOIN chúng với nhau khi cần thiết. Tôi tin rằng đây là cách tiếp cận được đề xuất trong SQL Server 2000.

Gần đây chúng tôi đã di chuyển sang SQL Server 2008 có varchar (MAX) và chúng tôi đang tự hỏi liệu nó có tốt hơn hay bằng hiệu suất nếu chúng tôi loại bỏ các ghi chú riêng của mình bảng và sử dụng varchar (MAX) thay thế. Nó chắc chắn sẽ thuận tiện hơn.

+0

Sự hiểu biết của tôi là varchar (MAX) giữ dữ liệu thực tế trên một trang riêng biệt và chỉ giữ con trỏ đến vị trí đó trong bảng thực tế. Nói cách khác, SQL Server đang làm nội bộ mà chúng tôi đã làm bằng tay. Điều đó có đúng không? Từ tất cả các phản ứng, nó chắc chắn có vẻ như nó là, nhưng tôi muốn làm rõ. Đó thực sự là câu hỏi tôi thắc mắc. – msigman

+0

Không; đó là cách kiểu 'văn bản' hoạt động. Với 'varchar (max)', điều này chỉ đúng * khi kích thước vượt quá kích thước tối đa của 'varchar' *, là 8000. Trong kích thước tối đa, nó được lưu trữ theo cách truyền thống. –

+0

OK. Cảm ơn bạn, tôi tin rằng tôi rõ ràng bây giờ. Chúng tôi sẽ để nó như nó hiện đang được thiết lập. – msigman

Trả lời

3

Tôi không hoàn toàn rõ ràng về thiết lập của bạn ... nếu bạn nói rằng người dùng có thể nhập 18 ghi chú riêng lẻ (có lẽ là "loại" khác nhau), thì bạn nên giữ bảng ghi chú phụ. Trong trường hợp này, có, chuyển từ varchar(8000) sang varchar(MAX) sẽ cho phép người dùng lưu hơn 8000 ký tự trong ghi chú.

Chỉ cần rõ ràng, nếu người dùng nhập ghi chú cá nhân, thì bạn nên để lại các bảng được chuẩn hóa như bạn có ngay bây giờ. Bạn có nên chuyển đổi từ varchar(8000) sang varchar(max) hay không là câu hỏi liệu bạn có muốn cho phép người dùng ủy quyền hơn 8000 ký tự hay không. Lưu ý rằng, nếu có, nội dung sẽ được lưu trữ ngoài hàng, như thể bạn đang sử dụng loại TEXT trong SQL Server trước 2005.

Nếu bạn đang nói (có vẻ như bạn), người dùng có thể nhập một ghi chú lớn và bạn tự động chia thành nhiều phần gồm tối đa 8000 ký tự, sau đó bạn nên xóa phần thứ hai bảng và đặt một cột varchar(MAX) duy nhất trên bản ghi cha.

Đây có phải là những gì bạn đang yêu cầu không?

+0

Cảm ơn bạn. Người dùng thực tế đang nhập 18 ghi chú khác nhau, khác nhau. Tôi đoán tôi không nên đề cập đến 8000 vì nó thực sự là một vấn đề riêng biệt, như bạn đề cập đến. Chúng tôi sẽ để lại các bảng bình thường. – msigman

2

Thiết kế tốt hơn là giữ bảng ghi chú (bạn vẫn có thể tăng độ dài của lưu ý bằng cách sử dụng VARCHAR (MAX) sẽ giới thiệu một số chậm xuống).

Điều này sẽ cho phép bạn xử lý từng ghi chú độc lập với những người khác dưới dạng các thực thể riêng biệt trong cơ sở dữ liệu.

3

Có trường varchar(max) trong bảng "chính" của bạn là một ý tưởng tồi, đặc biệt nếu bạn đã có phần nào được chuẩn hóa.

Điều này cũng sẽ dẫn đến chia tách trang, phân mảnh và hiệu suất thực sự kém trên bảng chính của bạn.

Khi ai đó thêm ghi chú, nếu trường không có trong bảng ghi chú đó, trường có thể lấp đầy trang dữ liệu và chia nhỏ trang khác, đó là phân đoạn, là BAD.

0

Tôi sẽ thiết lập một bảng Ghi chú với khóa chính bao gồm khóa ngoài cho thực thể mẹ và số ghi chú và cột đơn [n] varchar (tối đa). Điều này cho phép bạn có nhiều ghi chú cho mỗi thực thể mẹ.

varchar (tối đa) sẽ lưu trữ tối đa 8000 octet trong một cột đơn, thông thường. nếu kích thước vượt quá (tối đa 2.1gb), dữ liệu sẽ tràn qua các trang tràn, giống như văn bản/ntext/hình ảnh hiện không được chấp nhận. Đối phó với dữ liệu văn bản/blob là một rắc rối rất lớn: SQL bây giờ xử lý nó sotto voce, như nó đã được. Tất cả bạn nhận được trở lại là một chuỗi.

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