Thêm một ID trong mỗi bảng ngay cả khi không cần thiết?


8

Đây là thiết kế tốt hay xấu để thêm vào, theo mặc định, trường ID trong mỗi bảng trong cơ sở dữ liệu, ngay cả khi bạn không thấy hiện tại sử dụng ID này (Ví dụ trong bảng MxN)?


nếu bạn không có cột id, liệu có trường nào khác tạo nên khóa chính không?
Thanos Papathanasiou

Tôi thường thêm ID nếu chúng có thể được sử dụng trong một bảng khác ... nó sẽ tiết kiệm dung lượng mặc dù chỉ một chút
zfm

Câu trả lời:


3

Trong nhiều trường hợp, có một ID nhân tạo trên mỗi bảng là rất triệu tập; trong một số trường hợp, đó chỉ là một nỗi đau trong **.

Nói chung, tôi làm điều đó trên mọi dự án tôi đang làm.

Ưu điểm:

  • Nói chung, việc viết hoặc tạo mã truy cập dễ dàng hơn khi mỗi và mọi bảng có thể được truy cập bởi một trường khóa được gọi là ID, loại Integer.

  • Đôi khi, các phím tự nhiên rất dễ bay hơi. Ví dụ, trong một hệ thống quản lý kho đã rất phức tạp, chúng tôi đã phải đối mặt với nhiệm vụ thay đổi mã sản phẩm, ví dụ như sản phẩm 001234 sẽ được gọi là 002345 trong tương lai. Thật không may, hệ thống đó đã không sử dụng ID nhân tạo, nhưng mã sản phẩm làm khóa chính. Đương nhiên, mã sản phẩm cũng là một khóa ngoại trong hàng chục bảng khác. Do đó, việc đánh số lại thực sự khó khăn và tốn kém và không thể thực hiện được trong giờ làm việc. Phiên bản tiếp theo của phần mềm đã sử dụng ID nhân tạo, vì vậy đây chỉ là một CẬP NHẬT đơn giản trên bảng sản phẩm.

  • Đôi khi, các phím tự nhiên không phải là duy nhất ngay cả khi chúng phải như vậy. Ở nước tôi, vì một số lý do, một vài SSN đã được ban hành hai lần.

  • Các khóa lõm trở nên cồng kềnh khi cấu trúc dữ liệu phức tạp; có một bảng phụ phụ với một khóa được kết hợp gồm 4 phần khá khó để làm việc.

Nhược điểm:

  • Về bản chất, các ID đó không có ý nghĩa gì ngoài hệ thống, vì vậy bạn cần rất nhiều tra cứu để dịch các ID đó thành các khóa tự nhiên.

  • Lấy khóa trên cùng từ bảng phụ phụ đã nói đòi hỏi một sự tham gia lớn thông qua toàn bộ chữ tượng hình.

  • Việc hợp nhất dữ liệu đến với các bản ghi hiện tại là khó khăn hơn, bởi vì một lần nữa cần phải tra cứu thêm.


2
Bullet 2: Đây có phải là trước đây ON UPDATE CASCADE?
Izkata

1
@Izkata, tôi sẽ không bao giờ cho phép cập nhật tầng trên cơ sở dữ liệu cấp doanh nghiệp vì nó rất có thể gây ra sự cố về hiệu suất / chặn / khóa khi số lượng lớn hồ sơ được thay đổi. Bạn thực sự không muốn khóa người dùng trong khi 10.000.000 hồ sơ được cập nhật. Đây là lý do tại sao nhiều người tin rằng một khóa dễ bay hơi là xấu, nó gây ra quá nhiều công việc trong cơ sở dữ liệu khi nó thay đổi.
HLGEM

@HLGEM Mặc dù tôi thừa nhận không có cơ sở dữ liệu để chơi cùng, nhưng đối với tôi, khóa cấp hàng của InnoDB sẽ giúp giảm thiểu nó, đặc biệt là nếu tạm dừng được thêm vào giữa việc cập nhật mọi bản ghi X. Ngoài ra, theo cách mô tả của ammoQ, vấn đề thực sự là họ phải thay đổi thủ công tất cả các khóa ngoại (ví dụ: công cụ MyISAM trên MySQL không hỗ trợ nó).
Izkata

Izkata: Vấn đề không phải là đưa ra 30 tuyên bố cập nhật thay vì một. Phần đó là dễ dàng, ngay cả khi không sử dụng cập nhật xếp tầng. Vấn đề thực sự đã ảnh hưởng đến hàng ngàn hàng thay vì một hàng, gây ra bế tắc trên toàn hệ thống (được thừa nhận là không được thiết kế quá tốt). Cuối cùng, có một công việc hàng đêm để làm điều đó.
user281377

1
Nhược điểm +1: khó di chuyển dữ liệu giữa các môi trường khác nhau (dev, at, sản xuất, v.v.)
Marco Lackovic

6

khóa tổng hợp so với khóa tự nhiên và khóa đơn so với khóa ghép là cả hai chủ đề được tranh luận sôi nổi có mặt tích cực và tiêu cực ở cả hai mặt. Chúng giống như các tab so với khoảng trắng và dấu ngoặc nhọn trên các cuộc tranh luận dòng riêng của chúng.

Điều quan trọng nhất là chọn một bên và gắn bó với nó để thống nhất trong toàn bộ cơ sở dữ liệu. nói chung, các khóa tổng hợp được sử dụng đơn giản vì khó có khóa tự nhiên tốt cho mọi bảng và dễ nhất quán hơn khi mọi bảng đều có khóa tổng hợp.


4

Mỗi bảng nên có PK, số nhận dạng duy nhất hoặc ID khi bạn gọi nó. Trong trường hợp của MxN, bạn có PK, (một hợp chất). Vì vậy, không cần phải có một cái khác.

Xem thêm: Một hoặc hai khóa chính trong bảng nhiều-nhiều?

Sở thích cá nhân của tôi liên quan đến một chủ đề liên quan: PK không nên có mục đích sử dụng khác ngoài việc là PK. Vì vậy, tôi sẽ không sử dụng dữ liệu aa PK, ngay cả khi dữ liệu là "Tự nhiên duy nhất" IE: SSN, Ngày, Mã Zip Ect.


1
Bạn mâu thuẫn với chính mình. Các cột của khóa ghép trong bảng quan hệ có một công dụng khác ngoài việc là PK. Họ là chìa khóa nước ngoài quá. (Bên cạnh đó, tôi không đồng ý. Nếu bạn có thứ gì đó, đó là PK tự nhiên, tôi sẽ đi theo nó. Nếu tôi không bị ràng buộc với nó, tôi chắc chắn sẽ kết thúc với các mục mâu thuẫn vào một ngày nào đó và nếu hạn chế là có, tại sao không sử dụng nó làm khóa chính.)
Jan Hudec

2
Nói chung Pks được sử dụng làm FK trong các bảng khác nhau là một phần của PK, tôi thấy không có mâu thuẫn.
Morons

1
Tôi hiểu vị trí của bạn về các phím Tự nhiên, đó là cách tôi cẩn thận nói rằng đây là sở thích cá nhân của tôi.
Morons

3
@JanHudec: Những thứ độc đáo tự nhiên có xu hướng thay đổi tự nhiên. Ngoài ra, tôi đã thấy khá thường xuyên rằng các khóa tự nhiên có xu hướng không phải là số nguyên, như chuỗi, dẫn đến các vấn đề về hiệu suất nếu được sử dụng như PK>
Goran Jovic

Bạn cũng gặp phải các vấn đề mà bạn phải đối phó với Typose trong PK. Nó được sử dụng để làm cho tôi điên
Morons

0

Từ quan điểm thiết kế, đi với khóa chính tự nhiên, ghép và không phát minh ra khóa tổng hợp. Bất cứ điều gì không phải ở đó chỉ làm cho lược đồ trở nên phức tạp hơn để hiểu.

Từ quan điểm hiệu suất trong nhiều cơ sở dữ liệu, truy cập bảng bằng khóa chính số nguyên nhanh hơn bất kỳ cột được lập chỉ mục nào khác. Các cơ sở dữ liệu này cũng sẽ ngầm thêm khóa tổng hợp đó vào bất kỳ bảng nào không có (thường được gọi là "rowid" hoặc "oid" hoặc tương tự), do đó, việc thêm nó rõ ràng sẽ không mất gì cả.

Đối với các bảng MxN (quan hệ), việc truy cập chúng bằng khóa chính không có nghĩa gì; bạn truy cập chúng bằng một trong hai thành phần và nhận tập hợp các thực thể liên quan từ phía bên kia. Vì vậy, đối với các bảng này, không có ý nghĩa gì khi thêm khóa chính tổng hợp.

Đối với các bảng khác có khóa chính tổng hợp tốt hoặc không nguyên, tôi vẫn sẽ không thêm tổng hợp ban đầu, nhưng sẽ xem xét thêm nó trong khi điều chỉnh hiệu suất cho các bảng được truy cập trong các bảng quan trọng về hiệu năng.

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.