Hướng dẫn sử dụng các phím tổng hợp để xác định các hàng


8

Có phải là một thực tiễn tốt (hoặc sẽ có bất kỳ tác động bất lợi nào) khi sử dụng một bộ gồm 4 cột để xác định một hàng là duy nhất (một là khóa trước, ba cột còn lại là kiểu dữ liệu nổi)? Tôi đang cố gắng xây dựng một bảng (có 4 khóa được liên kết) sẽ mô tả một mục duy nhất trong bảng. Tôi tò mò liệu đây có phải là một kế hoạch tấn công tốt hay có cách nào tốt hơn không.

Đối với mục đích trực quan, hình ảnh bảng dưới đây. Chúng tôi có các mục kiểm kê được sắp xếp như bảng sau: ( [K]là biểu tượng của khóa chính, các dòng là mối quan hệ)

    Sheet_Class        Sheet_Type         Sheet_Size
    ===========        ==========         ==========
[K] Sheet_Class-.  [K] Sheet_Type--.  [K] Sheet_Size
                 '---- Sheet_Class  '---- Sheet_Type
                                          Length
                                          Width
                                          Thickness

Dữ liệu có thể hiển thị theo cách sau, nhưng để đơn giản, tôi đã loại trừ việc mang qua các cột được liên kết:

 Sheet_Class    Sheet_Type    Sheet_Size                        (Tables)
[Sheet_Class]  [Sheet_Type]  [Length], [Width], [Thickness]     (Column Values)
=============  ============  ==============================

Aluminum
               5052-H32
                             48, 96, 0.032
                             48, 96, 0.040
                             48, 96, 0.063

               6061-T6
                             60, 120,0.032
                             60, 120,0.040
                             60, 120,0.063

Steel
               1018-CRS
                             48, 96, 0.018
                             48, 96, 0.023
                             48, 96, 0.031

Vì nó đứng (và tôi đã hiển thị trong "lược đồ" ở trên), tôi sử dụng khóa chính số nguyên đơn giản (tăng tự động) cho các mục trong bảng Sheet_Size . Tuy nhiên, tôi muốn biết liệu có tốt hơn không khi sử dụng kết hợp các cột Sheet_Type , Chiều dài , Chiều rộngĐộ dày thay thế? Với mỗi mục trong Sheet_Size sẽ chia sẻ tất cả những phẩm chất độc đáo này và rằng một trường tăng tự động sẽ không thể hiện điều này đủ tốt, đây có phải là con đường tốt nhất để thực hiện?

Nếu tôi không giải thích rõ về tình huống này, xin vui lòng cho tôi biết. Tôi thấy mình cần phải phá vỡ các phần này (Loại so với Loại so với kích thước chứng khoán thực tế) của một tài liệu được kiểm kê cho các mục đích logic khác, nhưng tôi không ủng hộ bất kỳ loại phản hồi nào khác.

Bất kỳ hướng dẫn sẽ được đánh giá cao.

Cập nhật (08-12-2011)

Sau khi câu trả lời được đăng, tôi đã quyết định thực hiện kết hợp câu trả lời của Mark & câu trả lời của X-Zero . Tôi đã quyết định nên đặt một ràng buộc duy nhất cho các cột chiều dài, chiều rộng và độ dày, nhưng tôi cũng thích ý tưởng chia kích thước vật liệu thành các hàng duy nhất và liên kết chúng với mối quan hệ.

Thật không may, tôi không thể chấp nhận cả hai câu trả lời, vì vậy tôi sẽ chấp nhận X-Zeros vì đã lấy (những gì tôi cảm thấy) để có cái nhìn quan trọng hơn về vấn đề và đưa ra điều chỉnh lược đồ.

Cảm ơn tất cả mọi người vì câu trả lời.

Câu trả lời:


6

Sau khi suy nghĩ về điều này, tôi sẽ sửa lại cấu trúc bảng của bạn một chút.
Đầu tiên, sửa lại bảng kích thước bảng của bạn:

Sheet_size
===========
Id
Length
Width
Thickness

Thứ hai, tạo một bảng mối quan hệ kích thước tấm / loại:

Sheet_size_type
================
Sheet_Type_Id
Sheet_Size_Id

Sau đó, tạo các ràng buộc sau:

  1. Khóa chính (và chỉ mục) Sheet_sizephải là cột id
  2. Cần có một số loại khóa duy nhất (và chỉ mục) được thi hành trên các kích thước trong Sheet_size. Hãy xem xét, hai tấm kích thước (48, 96, .5) và (96, 48, .5) có bằng nhau không (nghĩa là hướng của các kích thước có quan trọng không)? Loại vấn đề này có thể khó thực thi nếu thông qua việc sử dụng các cột như một phần của khóa chính, nhưng trở nên dễ quản lý hơn khi sử dụng các ràng buộc và các thủ tục được lưu trữ.
  3. Khóa chính (và chỉ mục) Sheet_size_typenên sử dụng cả hai khóa ngoại, bắt đầu bằng khóa có số lượng thẻ thấp hơn (có thể sheet_type, được đưa ra ví dụ của bạn). Bạn có thể muốn một chỉ mục bổ sung theo hướng khác, nhưng nó có thể không cần thiết.

Bản sửa đổi này sẽ giúp bạn tiết kiệm không gian cơ sở dữ liệu (theo tỷ lệ số lượng loại trang tính có cùng kích thước) và không nên tác động quá nhiều.


Có những mối quan tâm tiềm năng khác về sự bình đẳng / duy nhất nếu bạn đang sử dụng một floatkiểu dữ liệu, vì sự thiếu chính xác có thể khiến bạn gặp bất ngờ. Bạn nên xem xét liệu một loại điểm cố định, với một số độ chính xác nhất định, sẽ phù hợp hơn.


Tôi đã dự định giới hạn Chiều dài và Chiều rộng ở một điểm thập phân (có thể là hai), và độ dày sẽ (nhiều nhất) sẽ mở rộng đến ba. Ngoài ra, chúng ta đang trở nên quá hữu hạn (và bản thân cổ phiếu không bao giờ xuất hiện ở bất kỳ con số nào). Ngoài ra, tôi thích suy nghĩ về việc phá vỡ các kích thước trang tính, nhưng vấn đề tôi gặp phải là các cột khác có liên quan (mà tôi đã loại trừ). (cần thêm phòng, xem bài tiếp theo)
Brad Christie

Vì đây là danh sách các cổ phiếu đã được kiểm kê, tôi phải đưa vào các thông tin khác như Mật độ và Chi phí / lb (chủ yếu dựa vào loại (và độ dày thậm chí. Ví dụ: "Thép" / "1018" có thể là 0,55 đô la / lb ở độ dày 0,008-0,125 ", nhưng trở thành 0,65 đô la / lb khi độ dày vượt quá 0,125". (Và điều này cũng có thể khác nhau giữa kích thước tấm 48 "x96" x0.250 "của 1018 so với 5052-H32). Tôi chỉ có một mục nhập cho 48 "x96" x0.125 "(mặc dù tôi cho rằng bảng mối quan hệ có thể có các số liệu bổ sung này)
Brad Christie

Nếu bạn chỉ cần một số lượng nhỏ các số thập phân, thì có, sử dụng độ chính xác cố định. Có, đó là nơi (trong trường hợp này) bạn sẽ đặt thông tin như vậy (ví dụ: chi phí là phụ thuộc vào loại và kích thước trang tính), mặc dù bạn có thể muốn tạo các bảng bổ sung có thể được tham chiếu. Bạn cũng có thể muốn xem xét việc tạo các loại dữ liệu tùy chỉnh (như mật độ) để mọi người không thử truy vấn dữ liệu của bạn theo những cách không mong muốn.
Clockwork-Muse

6

Trông giống như một quyết định quan trọng tự nhiên so với thay thế , ý kiến về phạm vi từ xem xét và thực tế đến học thuật , giáp với giáo điều. Tùy thuộc vào RDBMS, có các cân nhắc cho mô hình vật lý có thể có ý nghĩa hiệu năng đáng kể, ví dụ như lựa chọn khóa được nhóm trong SQL Server.

Cá nhân, nếu tôi có một khóa ứng cử viên thuộc tính hẹp, đơn lẻ, tôi muốn sử dụng nó. Theo mặc định, các phím rộng và / hoặc hỗn hợp sẽ thêm một đại diện thay thế cho mô hình. Trong trường hợp của bạn, tôi sẽ bỏ phiếu cho cột nhận dạng trên Sheet_Size làm khóa cụm chính và một ràng buộc duy nhất về loại / chiều dài / chiều rộng / độ dày.


Nhưng với điều kiện là bây giờ bạn có một khóa "tùy ý" được cung cấp cho hàng, làm thế nào duy nhất thực thi rằng các cột (khi được kết hợp) không thể có các giá trị trùng lặp? Theo hiểu biết của tôi thì thuộc tính duy nhất liên quan đến khóa. Bạn đang nói Sheet_Size INT PRIMARY KEYLength UNIQUE, Width UNIQUE, Thickness UNIQUE? Tôi vẫn không hiểu làm thế nào ngăn chặn các bản sao trong bảng (mà không áp dụng logic cho giao diện chèn). (Có lẽ tôi đang thiếu một cái gì đó?)
Brad Christie

Một ràng buộc duy nhất trên ba cột: ALTER TABLE dbo.Sheet_Size ADD CONSTRAINT UC_LạngWidthThickness UNIQUE ([Chiều dài], [Chiều rộng], [Độ dày])
Mark Storey-Smith

Cảm ơn bạn đã phản hồi. Tôi đồng ý rằng một ràng buộc duy nhất trên các cột sẽ là một giải pháp tuyệt vời, nhưng tôi cũng thích khuyến nghị của X-Zero về việc phá vỡ các kích thước trong một bảng mới (được liên kết với một bảng mới). Vì vậy, để kết hợp các ý tưởng, tôi sẽ áp dụng bảng kích thước ràng buộc duy nhất của anh ấy, đồng thời xóa thông tin mật độ & chi phí / lb và đặt nó vào bảng quan hệ.
Brad Christie

4

Tôi sẽ chuyển hướng bạn một chút đến câu trả lời này từ một câu hỏi trước .

Trích dẫn: "Liên quan đến cách thiết kế khóa chính đó, có hai trường phái tư tưởng:

  • một cái làm cho PK thành một cột riêng biệt, thường tự tạo, như GUID hoặc tự động tăng INT (trong trường hợp của bạn là cột định danh riêng biệt);
  • một cái làm cho PK là một cột (hoặc tập hợp các cột) bên trong bảng (trong trường hợp của bạn sẽ là tên người dùng hoặc email hoặc SSN, bất cứ điều gì làm cho người dùng đó là duy nhất) xác định duy nhất một bản ghi.

Bạn tuân thủ theo dòng nào, đó chỉ là vấn đề của hương vị. "

Tác dụng phụ của bất kỳ giải pháp được lựa chọn có thể là:

  • sử dụng các phím ghép ở mọi nơi sẽ có khả năng:

    • tăng lưu trữ cho tất cả các bảng liên quan;
    • tăng / làm phức tạp các chỉ số trên các FK thường được sử dụng;
    • làm phức tạp một chút bằng văn bản của tất cả các tuyên bố tham gia của bạn
    • làm cho ông Joe Celko vui mừng :-) (tài liệu tham khảo về ý kiến ​​của ông về khóa tự nhiên hoặc nhân tạo có thể được tìm thấy ở đâyđây , và hầu hết mọi nơi ông hỏi về vấn đề này)
  • sử dụng các khóa được tạo sẽ có khả năng:

    • đơn giản hóa 3 bước trước
    • làm phức tạp tình huống sao chép bảng với PK nhận dạng (tham khảo tại đây , tại đây hoặc tại đây )

Cá nhân tôi thích các khóa INT IDENTITY được tạo, nhưng những gì phù hợp với bạn sẽ ổn.


2

Các phím tổng hợp làm cho ý nghĩa hoàn hảo. Việc thực hiện khóa đó đảm bảo rằng các thuộc tính kinh doanh không thể được sao chép. Đó là một điều tốt vì việc ghi cùng một dữ liệu nhiều lần sẽ gây ra sự mơ hồ, phụ thuộc không mong muốn và làm cho lỗi người dùng và dữ liệu không chính xác có nhiều khả năng.

Chỉ riêng khóa tăng tự động sẽ không bảo vệ tính toàn vẹn của dữ liệu doanh nghiệp của bạn. Nếu khóa tăng tự động không phục vụ mục đích cụ thể nào (ví dụ như mục tiêu của tham chiếu khóa ngoại trong bảng khác) thì có thể bỏ nó một cách an toàn.


... Ngoại trừ việc giảm mức tăng tự động vì khóa ngoại sẽ yêu cầu sử dụng tất cả các cột kích thước làm một phần của khóa ngoại (nghĩa là tất cả bốn cột , khi bao gồm cả loại). Không phải thứ tôi muốn làm khóa ngoại, thời gian - chỉ một cột duy nhất. Tôi đồng ý rằng nên đặt một khóa duy nhất (và / hoặc kiểm tra ràng buộc) trên các kích thước (và loại, tùy thuộc vào thiết kế bảng).
Clockwork-Muse

@ X-Zero, tôi đã đưa ra quan điểm về các tham chiếu khóa ngoại trong đoạn thứ hai của tôi. Câu hỏi khi tôi đọc là liệu có nên thực hiện khóa tổng hợp không, có phải cũng có tăng tự động hay không.
nvogel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.