2011-04-20 39 views
7

Gần đây tôi đã chia một bảng cơ sở dữ liệu rất lớn thành các bảng nhỏ hơn, dễ quản lý và phần lớn tôi hài lòng với công việc của mình và tôi cảm thấy dữ liệu được chuẩn hóa đúng cách.Chuẩn hóa cơ sở dữ liệu

Nhưng có một ngoại lệ cho điều này. Các bảng được đề cập đến từ một cơ sở dữ liệu sản phẩm lưu trữ thông tin về (bạn đoán nó) các sản phẩm mà công ty bán. Tôi đã tách nhiều thông tin thành hai bảng: ProductBaseProductBasePackaging.

Những bảng này chứa ô thông tin có liên quan đến số phần cơ sở thay vì một sản phẩm riêng lẻ (có nhiều sản phẩm cho mỗi số cơ sở).

ProductBase chứa khá thông tin chung như MarketingCopy, Keywords vv và cũng thông tin về vật liệu xây dựng ví dụ, thành phần, vv

ProductBasePackaging dĩ nhiên nắm giữ dữ liệu về đóng gói.

Bây giờ tôi đang viết ứng dụng để thao tác dữ liệu, tôi bắt đầu tự đoán thứ hai. Có vẻ như tôi đã làm cho bản thân mình khó hơn bây giờ mà tôi phải theo dõi nhiều bảng sử dụng cùng một khóa (số phần cơ sở). Hay tôi có quyền tách chúng ra như vậy và có thể tiến thêm một bước nữa và tách riêng việc xây dựng thành bảng riêng của nó?

Tôi khá thành thạo trong việc sử dụng sql nhưng đây là lần đầu tiên tôi thực sự phải thiết kế cấu trúc cơ sở dữ liệu, hãy để cơ cấu lại cơ sở dữ liệu hiện có lớn. Vì vậy, về cơ bản những gì tôi yêu cầu là tôi nên có nhiều bảng với cùng một khóa được phân cách bằng loại dữ liệu hoặc giữ mọi thứ với nhau trong bảng duy nhất mà tôi có thể tham chiếu mọi thứ tôi cần từ một bảng bằng cùng một khóa?

Xin lỗi tôi biết đó là rất nhiều thứ để đọc, tôi hy vọng điều đó có ý nghĩa và cảm ơn tất cả những ai đã vượt qua!

Trả lời

8

Normalization có thể trông giống như một cơn đau ở một ** ngay bây giờ - nhưng tôi tin tưởng, trong thời gian dài, bạn sẽ có vui bạn đã làm nó! Các bảng "phẳng" không chuẩn hóa với mọi thứ nhưng bồn rửa nhà bếp trong chúng sẽ trở nên rất không thể quản lý theo thời gian, sự mâu thuẫn dữ liệu sẽ leo lên, và trước khi bạn biết nó, bạn có một đống dữ liệu khổng lồ làm cho bất kỳ ý nghĩa nữa! Có, việc tham gia các bảng có thể là một chút công việc - nhưng đặc biệt là để hiển thị dữ liệu, bạn chắc chắn nên xem lượt xem có thể giúp bạn viết những JOIN đó một lần và sau đó chỉ sử dụng chúng làm "bảng ảo" lần nữa.

Chuẩn hóa cơ sở dữ liệu - tối đa khoảng 3NF - là điều tốt (TM) chắc chắn! Tôi luôn khuyên bạn nên làm điều đó, và sau đó có thể giới thiệu lại một số hạn chế không chuẩn hóa khi nhu cầu hiệu suất có thể yêu cầu nó - nhưng chỉ theo cách được kiểm soát, và với sự hiểu biết và hiểu biết đầy đủ của bạn .

+1

+1 Tôi đồng ý về ** lượt xem **. OP cũng nên lưu ý rằng việc truy vấn các bảng 'JOIN'ed có thể nhanh hơn nhiều so với một bảng phẳng nếu bạn đã hủy trùng lặp hiệu quả. – Matthew

+1

+1. Có vẻ như O.P. đã hiểu đúng về nó. Các sản phẩm là các vật dụng cá nhân, phải không? Nhưng chúng được đưa vào các SKU khác nhau để bán. Gói 2,4,8, v.v. Có lẽ bao bì nhà đặc biệt cho Walmart, vv Bạn đã có (ít nhất) hai thực thể riêng biệt ở đây. –

+0

@Nicholas vâng bạn có nó đúng. Nhưng bạn có thể có thể xây dựng trên các thực thể riêng biệt trong ví dụ của bạn? – Nick

3

Câu trả lời là phụ thuộc vào.

Tùy thuộc vào những gì bạn thường truy vấn, cách bạn thường truy vấn, tần suất bạn truy vấn, bảng lớn như thế nào để giữ tất cả dữ liệu .... v.v. Tùy theo.
Ví dụ về thời điểm bạn có thể không phải là muốn bình thường hóa nếu bạn cần truy vấn dữ liệu tổng hợp hoặc có nguồn gốc thường xuyên và quá trình biên soạn phải mất một thời gian dài. Thông thường mặc dù tôi cho rằng dữ liệu phải được chuẩn hóa.

Điều đó đang được nói, tôi không chắc những gì bạn mô tả là "Bình thường hóa" nhiều như sự tách biệt của nó. Việc chuẩn hóa sẽ liên quan đến việc xóa dữ liệu trùng lặp trong các cột khác nhau.

Hãy lấy ví dụ về bao bì của bạn ... Dường như với tôi như bạn đã tạo một bản ghi trong một số ProductBasePackaging liên quan đến PartNumber tới số ProductBase hoặc thứ gì đó.

Trong thực tế, nếu bạn đang chuẩn hóa dữ liệu ... bạn chỉ có một hàng ProductBasePackaging cho mỗi loại bao bì ... như có thể bạn gửi 1000 sản phẩm khác nhau nhưng chỉ sử dụng 10 loại hộp khác nhau. ProductBasePackaging sẽ có 10 hàng, mỗi hàng có thông tin trên một hộp duy nhất ...sau đó ProductBase sẽ tham khảo hộp cần thiết của nó bằng cách PackagingID

+0

Bạn đúng, điều này là tách biệt hơn bình thường hóa mà câu hỏi này liên quan đến. Sự bình thường hóa mà tôi đã làm lúc đầu khi chúng tôi có một cái bàn lớn có một tấn ô trống vì có những thứ như "Chiều dài ngón tay cái" cho tạp dề và lặp đi lặp lại cùng một dữ liệu cho các mục trong cùng một phần cơ sở. 90% các ô trong bảng là dữ liệu trống hoặc lặp lại, nó rất đáng sợ. – Nick

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