2011-01-19 42 views
8

Tôi có một bảng với 25 cột, trong đó 20 cột có thể có giá trị null cho một số hàng (30-40%). Bây giờ chi phí của việc có hàng với 20 cột null là bao nhiêu? Điều này có ổn không?Câu hỏi thiết kế Sql

Hoặc

có thiết kế tốt để có một bảng khác để lưu trữ 20 cột đó và thêm bảng ref vào bảng đầu tiên không? Bằng cách này tôi sẽ chỉ ghi vào bảng thứ hai chỉ khi có giá trị.

Tôi đang sử dụng máy chủ SQL 2005. Sẽ di chuyển sang năm 2008 trong tương lai.

Chỉ 20 cột varchar, smallint nghỉ ngơi, smalldate

Những gì tôi đang lưu trữ: Các cột này lưu trữ các thuộc tính khác nhau của hàng nó thuộc về. Các thuộc tính này có thể là null đôi khi.

Bảng sẽ giữ ~ tỷ hàng

Vui lòng nhận xét.

+6

Bạn đang sử dụng máy chủ cơ sở dữ liệu nào? SQL Server 2008 hỗ trợ khái niệm các cột thưa thớt hỗ trợ kịch bản của bạn với tác động tối thiểu. –

+0

Hãy xem câu trả lời này: http://stackoverflow.com/questions/229179/null-in-mysql-performance-storage/230923#230923 Và http://dev.mysql.com/doc/refman/5.0/ vi/làm việc với null.html – RobertPitt

+0

Bạn đã xem xét kế thừa bảng chưa? –

Trả lời

2

Bạn nên mô tả loại dữ liệu bạn đang lưu trữ. Có vẻ như một số cột đó nên được chuyển sang một bảng khác. Ví dụ, nếu bạn có một số cột đại diện cho nhiều cột cho cùng một loại dữ liệu, thì tôi sẽ nói di chuyển nó sang một bảng khác Mặt khác, nếu bạn cần nhiều cột này để mô tả các loại dữ liệu khác nhau, thì bạn có thể sử dụng nhiều cột khác nhau. sau đó bạn có thể cần phải giữ nó như nó được.

Vì vậy, nó phụ thuộc vào những gì bạn đang làm mẫu.

+0

+1 để mô tả dữ liệu ... Nếu chúng ta biết các cột được đề cập, chúng tôi có thể đưa ra lời khuyên tốt hơn về tái cơ cấu (nếu necs.) – scunliffe

+1

Thêm thông tin về dữ liệu và loại – kheya

+0

@Projapati: Bạn dường như không muốn cung cấp nhiều chi tiết. Nói các cột "lưu trữ các thuộc tính khác nhau của hàng nó thuộc về" không cho tôi biết gì về loại dữ liệu bạn đang lưu trữ. Nếu bạn muốn cung cấp một số ví dụ, tôi có thể cho bạn biết những gì tôi nghĩ. Nhưng tôi cần nhiều hơn để tiếp tục. –

2

Có một số trường hợp cần một số cột trong số đó không? Nếu có, thì có lẽ bạn nên sử dụng một dạng thừa kế nào đó. Ví dụ, nếu đây là thông tin về bệnh nhân trong bệnh viện, và có một số dữ liệu chỉ có ý nghĩa đối với bệnh nhân nữ, thì bạn có thể tạo một bảng FemalePatients với những cột đó. Những cột phải luôn luôn được thu thập cho bệnh nhân nữ sau đó có thể được tuyên bố NOT NULL trong bảng riêng biệt đó.

2

Tùy thuộc vào kiểu dữ liệu (40 int không thể thực hiện được về cơ bản có cùng không gian như 40 int không rỗng, bất kể giá trị). Trong SQL Server, không gian khá hiệu quả với các kỹ thuật thông thường. Trong năm 2008, bạn có tính năng SPARSE.

Nếu bạn chia bảng theo chiều dọc với mối quan hệ 1: 1 tùy chọn, có khả năng gói hai bảng với chế độ xem và thêm trình kích hoạt trên chế độ xem để làm cho nó có thể cập nhật và ẩn cài đặt cơ bản.

Vì vậy, có rất nhiều tùy chọn, nhiều tùy chọn có thể được triển khai sau khi bạn thấy tải dữ liệu và hành vi.

1

Tạo bảng dựa trên các nhóm thuộc tính riêng biệt mà bạn có. Vì vậy, nếu bạn có một số dữ liệu mà một số cột của bạn không áp dụng thì sẽ có ý nghĩa khi có dữ liệu đó trong một bảng không có các cột đó. Càng nhiều càng tốt, tránh lặp lại cùng một thuộc tính trong nhiều bảng. Hãy chắc chắn rằng dữ liệu của bạn có ít nhất Boyce-Codd/5th Form bình thường và bạn sẽ không đi sai.