Các phím tiêu cực được sử dụng để làm gì?


12

Một số điều mới đối với việc sử dụng cơ sở dữ liệu SQL tiêu chuẩn (hiện đang hoạt động với MySQL) Tôi chưa chạy qua nhiều cách sử dụng này.

Khi nào và tại sao nó hữu ích khi có các khóa âm (hoặc đúng hơn là được ký) lập chỉ mục một bảng?


5
trước hết, bất cứ ai đang từ chối mà không để lại phản hồi, bạn đang thực hiện một dịch vụ. Tiếp theo, câu trả lời cho câu hỏi tuyệt vời này.
jcolebrand

1
Chủ đề này là hấp dẫn. Cá nhân tôi chưa bao giờ nghe về khái niệm này. Câu hỏi này không bao giờ nên bị đánh giá thấp. +1 từ tôi để giới thiệu khái niệm này.
RolandoMySQLDBA

Câu trả lời:


13

Tất cả khóa chính là một giá trị mà chúng tôi đã xác định là giá trị cực kỳ quan trọng trong một bản ghi. Cho dù khóa đó là int đã ký, int không dấu, chuỗi, blob (thực ra, có giới hạn) hoặc UUID (hoặc bất kỳ tên nào ngày nay), thực tế vẫn tồn tại rằng đó là khóa và đó là điều quan trọng nhất

Vì chúng tôi không bị hạn chế chỉ sử dụng các số được định hướng tích cực cho các khóa của mình, nên có ý nghĩa khi xem xét rằng một số nguyên đã ký sẽ chỉ đạt ~ 2 tỷ, trong khi một số nguyên không dấu sẽ lên tới ~ 4 tỷ. Nhưng không có gì sai khi sử dụng int đã ký, đặt giá trị ban đầu là ~ -2 tỷ và đặt mức tăng của một. Sau ~ 2 tỷ hồ sơ, bạn sẽ đạt "không" và sau đó bạn sẽ tiếp tục ~ 2 tỷ.

Về lý do tại sao có "khóa âm" trong một bảng sẽ hữu ích, đó là câu hỏi tương tự như "tại sao có khóa trong bảng" lại hữu ích. "Giá trị" của khóa không có tác động đến trạng thái của khóa đó. Một chìa khóa là một chìa khóa là một chìa khóa.

Điều quan trọng là nếu khóa là hợp lệ.

Về lý do tại sao sẽ hữu ích khi cho phép các khóa âm, tôi có thể đề xuất một số lý do:

Điều gì sẽ xảy ra nếu bạn muốn chỉ ra lợi nhuận trong hệ thống bán hàng là số đơn đặt hàng bán hàng âm, khớp với số đơn đặt hàng bán tích cực, do đó làm cho mối tương quan trở nên dễ dàng (điều này là ngây thơ và được thiết kế kém, nhưng nó sẽ hoạt động theo nghĩa "bảng tính").

Điều gì sẽ xảy ra nếu bạn muốn có một bảng người dùng và chỉ ra rằng những người có số âm được kiểm soát bởi hệ thống (SO thực hiện điều này, cho người dùng nguồn cấp dữ liệu trò chuyện).

Tôi có thể tiếp tục, nhưng thực sự lý do duy nhất tại sao con số âm là quan trọng là nếu bạn hoặc tôi gán tầm quan trọng cho nó. Bên cạnh đó, không có lý do tuyệt vời nào cho giá trị của một khóa có bất kỳ ảnh hưởng nào đến chính khóa đó.


Đã chỉnh sửa bit 'sự cố xảy ra', vì nhiều khả năng đó là sự hiểu lầm do thiếu kinh nghiệm. Thú vị đọc. Tôi đã phần nào tưởng tượng sẽ có một tình huống mà giá trị âm của khóa bằng cách nào đó hữu ích trong việc mã hóa (i, e mà không quyết định nó có nghĩa là một điều cụ thể) nhưng đây là suy nghĩ rất hữu ích khi bạn phân chia mạnh thành hai nhóm và don 't muốn sử dụng thêm một bool: p
Garet Claborn

1
@Garet ~ Vì vậy, bạn đưa ra một quan điểm hay: "giá trị của khóa bằng cách nào đó hữu ích trong việc mã hóa" và thỉnh thoảng tôi vẫn sử dụng các khóa của mình theo cách đó, nhưng điều đó không liên quan gì đến khía cạnh cơ sở dữ liệu. Cơ sở dữ liệu là một kho. Ứng dụng tiêu thụ dữ liệu, mặt khác, quan tâm đến các giá trị . Nhưng vâng, +/- boolean là một mánh khóe gọn gàng, tôi đã thấy nó được sử dụng nhiều lần cho một hiệu ứng như vậy.
jcolebrand

2
-1 để ngụ ý rằng các giá trị mục đích kép như thế này là bất cứ điều gì khác hơn là một ý tưởng tồi. Bạn cần một int và bool? Sử dụng một int và bool.
Jack nói hãy thử topanswers.xyz

1
@JackPDoureb Tôi không nhớ là khuyến khích mọi người làm điều đó, tôi hoàn toàn nhớ lại ngụ ý rằng lĩnh vực và dữ liệu của nó là hai điều khác nhau. Cảm ơn vì ít nhất đã cung cấp phản hồi mang tính xây dựng trên downvote của bạn, nhưng tôi không thể nói rằng quan sát đó có nghĩa là bất cứ điều gì theo khái niệm "khóa âm được sử dụng cho" vì đó là vấn đề logic ứng dụng, không phải là vấn đề của lớp cơ sở dữ liệu . Tôi đã muốn làm nổi bật cách những thứ đó được sử dụng trong lớp ứng dụng, nhưng trong lớp cơ sở dữ liệu chúng không có bất kỳ ý nghĩa nào.
jcolebrand

1
@JackPDoureb ~ Tôi đã sử dụng ví dụ cụ thể đó bởi vì có một trang web rất nổi tiếng (mạng lưới các trang web) mà bạn có thể đã nghe nói về điều đó, vì vậy tôi không muốn loại bỏ nó, bởi vì nó là hợp lệ "lừa". Kiểm tra người dùng này dba.stackexchange.com/users/-1/community và cho tôi biết ID của anh ta là gì. Tôi gần như có thể đảm bảo với bạn rằng userid là khóa chính (và trong nhiều bảng khác là khóa ngoại). Chỉ vì nó là thiết kế ứng dụng tồi đối với bạn, không có nghĩa là nó không hợp lệ. Nhưng một lần nữa, đó không phải là thiết kế db, đó là thiết kế miền. Được cấp, logic db hỗ trợ nó
jcolebrand

10

Nếu chúng ta đang nói về các cột nhận dạng hoặc số tự động, thì giá trị đó sẽ không có ý nghĩa. (đôi khi, theo như người dùng trò chuyện của SO được chú ý bởi drachenstern, điều mà tôi đã làm trước đây)

Tuy nhiên, nhìn chung bạn sẽ mất một nửa phạm vi của mình nếu bạn đang sử dụng các số nguyên đã ký.
Xem: Phải làm gì khi một trường trong bảng tiếp cận với số nguyên 32 bit được ký hoặc không dấu tối đa?

Một ví dụ khác: Trong các kịch bản sao chép nhỏ, sử dụng các giá trị âm cho một trang web và tích cực cho một trang web khác cung cấp một số kiến ​​thức ngầm về nguồn của bất kỳ hàng nào.


và đảm bảo rằng bạn bằng cách nào đó ràng buộc các giá trị đầu vào tại mỗi trang web nếu không bạn sẽ gặp phải một mớ hỗn độn khủng khiếp khi "kiến thức ngầm" của bạn hóa ra là sai.
Jack nói hãy thử topanswers.xyz

@JackPDoureb: bạn sẽ sử dụng KHÔNG ĐƯỢC THAY ĐỔI để tránh tạo ra các giá trị trên trang web sai
gbn

cùng với những hạn chế kiểm tra ? Ngoài ra, có một tương tự MySQL (hoặc khác) NOT FOR REPLICATIONmà bạn biết không?
Jack nói hãy thử topanswers.xyz

@JackPDoureb: xin lỗi, không chắc chắn về máy chủ không SQL
gbn

8

Không phải tất cả các hệ thống cơ sở dữ liệu thậm chí còn hỗ trợ các kiểu số nguyên không dấu, MSSQL là một trong những kiểu không có. Trong các trường hợp này, các giá trị âm có thể có trong các trường khóa số nguyên chỉ vì chúng có thể có trong loại (bạn có thể sử dụng các quy tắc hoặc trình kích hoạt để chặn chúng, như trong ví dụ này , nhưng có lẽ không cần thêm chi phí cho việc thực thi các quy tắc đó vào mỗi giao / cập nhật).

Đối với cơ sở dữ liệu có liên quan, giá trị thực của khóa chính không quan trọng miễn là nó là duy nhất trong bảng. Đối với nó -42 và 42 chỉ là hai số khác nhau theo cùng một cách 42 và 69 - nghĩa là sẽ chỉ được truyền vào tính tiêu cực hoặc không có giá trị bởi mã của bạn.

Không hỗ trợ các loại số nguyên không dấu có lẽ là một quyết định thiết kế dựa trên việc giảm độ phức tạp - tức là không muốn hai loại số nguyên 32 bit khác nhau lo lắng về việc kiểm tra phạm vi khi gán giá trị giữa chúng. Nó không giới hạn số lượng chỉ mục có thể có trong trường tăng tự động bắt đầu từ 0 hoặc 1 đến một nửa những gì có thể có trong loại không dấu (~ 2e9 thay vì ~ 4e9) nhưng đây hiếm khi là một vấn đề quan trọng (nếu bạn có thể cần Dù sao, một số giá trị chính có độ lớn mà bạn có thể đã sử dụng cho loại 64 bit, đặc biệt là nếu sử dụng kiến ​​trúc 64 bit trong đó các giá trị đó được xử lý không kém hiệu quả sau đó là 32 bit) mặc dù nếu bạn có thể muốn phạm vi đầy đủ và cần để bám vào 32-bit vì lý do không gian, bạn có thể bắt đầu gia tăng ở -2,147,483,647.


Vâng, tôi nghĩ rằng chúng tôi đã bao phủ mặt đất đó trước đó;) tehehe dba.stackexchange.com/questions/983/ ám
jcolebrand

tinyint không dấu (0 .. 255). Tôi thường tạo một ràng buộc kiểm tra trên các cột số nguyên để đảm bảo các giá trị là không âm, vì mã chắc chắn sẽ được viết mà mặc nhiên giả định nó và các lỗi lạ sẽ xuất hiện nếu bằng cách nào đó một giá trị âm xuất hiện.
Ed Avis
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.