Danh sách cửa hàng trong cột MySQL

Ví dụ: nếu tôi muốn lưu trữ danh sách bạn bè của người dùng, thì cách tôi có thể nghĩ ra sẽ giống như thế này

người dùng. bạn
John. Jim
John. Bob
John. Amy
Bob. Jim
Bob. Amy

Vì vậy, danh sách bạn bè của John sẽ bao gồm Jim, Bob và Amy và danh sách bạn bè của Bob sẽ bao gồm Jim và Amy. Nhưng có vẻ như không hiệu quả khi tạo một hàng mới mỗi khi cần một mục mới trong danh sách

Tôi muốn có thể lưu trữ các giá trị như thế này

người dùng. danh sách bạn bè
John. Jim,Bob,Amy
Bob. Jim, Amy

Điều gì sẽ là cách hiệu quả nhất để làm điều này?

13 Sep '08 #

9 33372

Xin chào

Phương pháp thứ hai bạn đề cập không bao giờ nên được sử dụng. Không trường nào được chứa nhiều hơn một mẩu dữ liệu

Một phương pháp đơn giản để làm điều gì đó như thế là tạo hai bảng. Một cho thông tin người dùng và một cho mối quan hệ giữa mỗi người dùng

Nó có thể trông giống như

  1. Người sử dụng
  2. ----------------
  3. UserID Tên người dùng
  4. 1        John
  5. 2        Jim
  6. 3        Amy
  7. ----------------
  8. Quan hệ người dùng
  9. ----------------
  10. UserID FriendID
  11. 1        2
  12. 1        3
  13. 2        1
  14. 3        2
  15. ----------------

Trường hợp cả hai trường của bảng đếm UserRelation đều tham chiếu đến trường UserID trong bảng Người dùng. Bạn thậm chí có thể tham gia chúng với tư cách là Khóa chính để tránh các mục nhập trùng lặp

13 Sep '08 #

Xin chào

Phương pháp thứ hai bạn đề cập không bao giờ nên được sử dụng. Không trường nào được chứa nhiều hơn một mẩu dữ liệu

Một phương pháp đơn giản để làm điều gì đó như thế là tạo hai bảng. Một cho thông tin người dùng và một cho mối quan hệ giữa mỗi người dùng

Nó có thể trông giống như

  1. Người sử dụng
  2. ----------------
  3. UserID Tên người dùng
  4. 1        John
  5. 2        Jim
  6. 3        Amy
  7. ----------------
  8. Quan hệ người dùng
  9. ----------------
  10. UserID FriendID
  11. 1        2
  12. 1        3
  13. 2        1
  14. 3        2
  15. ----------------

Trường hợp cả hai trường của bảng đếm UserRelation đều tham chiếu đến trường UserID trong bảng Người dùng. Bạn thậm chí có thể tham gia chúng với tư cách là Khóa chính để tránh các mục nhập trùng lặp
Đây gần như là thiết lập mà tôi hiện có, nhưng tôi nghĩ nó không hiệu quả. Vì vậy, chỉ để làm rõ, đây là cách tốt nhất để lưu trữ tập dữ liệu kiểu danh sách?

Một thứ khác. Trên bảng thứ hai đó, khóa chính duy nhất sẽ là gì?

14 Sep '08 #

Đúng. Đây gần như là cơ sở của một N. mối quan hệ M

Điều này cũng hiệu quả hơn nhiều so với những gì bạn đã đề xuất trong bài đăng đầu tiên của mình

Đầu tiên, ví dụ đầu tiên của bạn lưu trữ mọi thứ dưới dạng trường văn bản. Tìm kiếm thông qua các số nguyên nhanh hơn nhiều so với văn bản, ngay cả khi các trường văn bản được lập chỉ mục. Chưa kể dung lượng đĩa mà tất cả văn bản đó chiếm, so với các số nguyên

Ví dụ thứ hai của bạn, trong khi sử dụng cấu trúc bảng ít phức tạp hơn, lưu trữ nhiều phần dữ liệu trong mỗi trường dưới dạng một chuỗi, chuỗi này phải được xử lý và chia thành từng phần riêng lẻ mỗi khi cần sử dụng bất kỳ phần nào trong số chúng.
Chi phí hoạt động vượt xa bất kỳ chi phí hoạt động nào mà một THAM GIA đơn giản sẽ gây ra, đặc biệt là sử dụng cấu trúc đơn giản, giống như cấu trúc tôi đã đăng.

Bảng thứ hai không cần khóa chính số nguyên một cột truyền thống mà chúng tôi sử dụng trên hầu hết các bảng.
Bạn có thể sử dụng hai cột khóa ngoại làm khóa chính.

  1. TẠO BẢNG BẢNG Quan hệ người dùng [
  2. UserID_FK INT Chưa ký Không phải Không Tham chiếu Người dùng[UserID],
  3. FriendID_FK Int Unsigned Not Null References Người dùng[UserID],
  4. Khóa chính [UserID_FK, FriendID_FK]
  5. ];

Điều này cũng sẽ bảo vệ bảng khỏi các mục nhập trùng lặp, chẳng hạn như liên kết một người dùng hai lần với cùng một người bạn

14 Sep '08 #

Đúng. Đây gần như là cơ sở của một N. mối quan hệ M

Điều này cũng hiệu quả hơn nhiều so với những gì bạn đã đề xuất trong bài đăng đầu tiên của mình

Đầu tiên, ví dụ đầu tiên của bạn lưu trữ mọi thứ dưới dạng trường văn bản. Tìm kiếm thông qua các số nguyên nhanh hơn nhiều so với văn bản, ngay cả khi các trường văn bản được lập chỉ mục. Chưa kể dung lượng đĩa mà tất cả văn bản đó chiếm, so với các số nguyên

Ví dụ thứ hai của bạn, trong khi sử dụng cấu trúc bảng ít phức tạp hơn, lưu trữ nhiều phần dữ liệu trong mỗi trường dưới dạng một chuỗi, chuỗi này phải được xử lý và chia thành từng phần riêng lẻ mỗi khi cần sử dụng bất kỳ phần nào trong số chúng.
Chi phí hoạt động vượt xa bất kỳ chi phí hoạt động nào mà một THAM GIA đơn giản sẽ gây ra, đặc biệt là sử dụng cấu trúc đơn giản, giống như cấu trúc tôi đã đăng.

Bảng thứ hai không cần khóa chính số nguyên một cột truyền thống mà chúng tôi sử dụng trên hầu hết các bảng.
Bạn có thể sử dụng hai cột khóa ngoại làm khóa chính.

  1. TẠO BẢNG BẢNG Quan hệ người dùng [
  2. UserID_FK INT Chưa ký Không phải Không Tham chiếu Người dùng[UserID],
  3. FriendID_FK Int Unsigned Not Null References Người dùng[UserID],
  4. Khóa chính [UserID_FK, FriendID_FK]
  5. ];

Điều này cũng sẽ bảo vệ bảng khỏi các mục nhập trùng lặp, chẳng hạn như liên kết một người dùng hai lần với cùng một người bạn
Tôi không quen với cú pháp tạo bảng tham chiếu khóa ngoại. Bạn có thể giải thích việc sử dụng hai tên cột với Khóa chính[] không?

Cảm ơn đã giúp đỡ

14 Sep '08 #

Chắc chắn rồi

Nói một cách đơn giản, nếu bạn chỉ định nhiều cột trong mệnh đề Khóa chính, MySQL sẽ tạo một khóa chung, bao gồm tất cả các cột đó

Giá trị thực của Khóa chính sẽ giống như.
Trường hợp các giá trị col1-colN sẽ được thay thế bằng giá trị của từng cột trong hàng đã cho.

Do đó, bạn không thể tạo một hàng chứa tổ hợp chính xác các giá trị cho các cột PK như bất kỳ hàng nào trước đó. Giá trị Khóa chính phải là duy nhất, thậm chí mỗi cột tạo nên Khóa chính có thể có các mục nhập trùng lặp

Điều này làm cho điều này trở nên lý tưởng cho tình huống chính xác mà chúng ta đang thảo luận

14 Sep '08 #

Vì vậy, nếu bảng Người dùng và Quan hệ người dùng được triển khai trong một ứng dụng thực tế, để hiển thị danh sách bạn bè của John, bạn phải thực hiện như sau

  1. CHỌN UserID TỪ `User` WHERE UserName = 'John'

Và chúng ta sẽ nhận được 1. Sau đó, chúng tôi sẽ làm.

  1. CHỌN ID bạn bè TỪ `UserRelation` WHERE UserID = 1

Và chúng ta sẽ nhận được 2 và 3. Sau đó, chúng tôi sẽ làm.

  1. CHỌN Tên người dùng TỪ `UserRelation` WHERE UserID = 2
  2. CHỌN Tên người dùng TỪ `UserRelation` WHERE UserID = 3

Và cuối cùng chúng tôi cũng có được danh sách bạn thân của John, Jim và Amy. Tất cả những điều này có thực sự nhanh hơn việc chỉ có.

  1. Bạn bè
  2. ----------------
  3. Tên người dùng Tên bạn bè
  4. John     Jim
  5. John     Amy
  6. Jim      John
  7. Amy      John
  8. ----------------

Where we could simply run SELECT FriendName FROM `Friend` WHERE UserName = 'John'?

11 Oct '08 #

Có. Đối sánh văn bản thường chậm hơn nhiều so với đối sánh số, mặc dù cách tiếp cận của bạn rất đơn giản.
Chưa kể rằng cách bạn đang đề xuất sẽ lãng phí vô số dung lượng ổ đĩa so với cách thích hợp.

Bạn cần sử dụng các công cụ có sẵn trong cơ sở dữ liệu quan hệ.
Truy vấn CHỌN không chỉ giới hạn ở cú pháp CHỌN TỪ ĐÂU. Bạn có thể yêu cầu nó tìm nạp dữ liệu từ nhiều bảng và yêu cầu nó lọc dữ liệu này dựa trên nhiều hơn sau đó kiểm tra boolean x = y đơn giản.

Đây là cách một cơ sở dữ liệu như vậy nên được sử dụng

  1. CHỌN `Người dùng`. `Tên người dùng` NHƯ 'Tên bạn bè'
  2. TỪ `Người dùng`
  3. INNER THAM GIA `UserRelation`
  4. BẬT `Người dùng`. `UserID` = `UserRelation`. `ID bạn bè_FK`
  5. VÀ `Mối quan hệ người dùng`. `UserID_FK` = [
  6. CHỌN `UserID` TỪ `Người dùng`
  7. WHERE `UserName` = 'John'
  8. ]

Nó nối hai bảng và lọc dữ liệu để hiển thị bạn bè của người dùng được chọn bởi truy vấn con.
Lưu ý rằng tôi cho rằng Tên người dùng là duy nhất, đó là lý do tại sao tôi sử dụng nó trong truy vấn con mà không có mệnh đề GIỚI HẠN.

Nó thực hiện chính xác những gì mà tất cả các truy vấn CHỌN của bạn thực hiện, nhưng theo cách phù hợp.
Đây là sức mạnh thực sự của cơ sở dữ liệu quan hệ, đó là khả năng nối các bảng và lọc dữ liệu dựa trên nhiều hơn là chỉ một bảng duy nhất câu lệnh SELECT FROM WHERE.

Nếu bạn không hiểu cú pháp, tôi khuyên bạn nên đọc về cú pháp Tham gia và Truy vấn con.
Nếu nó hoàn toàn mới đối với bạn, bạn có thể muốn tra cứu một số hướng dẫn về các khái niệm đó.

11 Oct '08 #

Tất cả đều ổn và tốt cho đến khi người bạn đó có nhiều hơn một người bạn lol

17 Mar '11 #


Làm thế nào để bạn có nghĩa là?

Toàn bộ mục đích của các khái niệm mà chúng ta đang nói đến ở đây là liên kết một hàng với nhiều hàng khác. [Đọc. cho phép một người kết bạn với nhiều người. ]

Tôi có thể lưu trữ danh sách trong cơ sở dữ liệu MySQL không?

Bạn có thể lưu trữ biểu diễn thực sự được sử dụng trong ứng dụng -- hoặc thực sự là phiên bản được đánh số thứ tự của nó . Tuy nhiên, bạn không nhận được chức năng SQL nào từ điều này, chẳng hạn như có thể đếm số tọa độ hoặc tìm nạp các hàng chỉ có một tên nhất định. Lưu câu trả lời này. Hiển thị hoạt động trên bài đăng này.

Tôi có thể lưu trữ một mảng trong MySQL không?

Mặc dù mảng là một trong những kiểu dữ liệu phổ biến nhất trong thế giới lập trình, nhưng MySQL thực tế không hỗ trợ lưu trực tiếp kiểu mảng. You can't create a table column of array type in MySQL. The easiest way store array type data in MySQL is to use the JSON data type.

Làm thế nào bạn có thể liệt kê tất cả các cột cho một bảng nhất định?

Cách linh hoạt hơn để lấy danh sách các cột trong bảng là sử dụng lệnh SHOW COLUMNS của MySQL . Như bạn có thể thấy kết quả của lệnh SHOW COLUMNS này giống như kết quả của câu lệnh DESC.

Bạn có thể lưu trữ những gì trong MySQL?

MySQL có thể hoạt động như một Kho lưu trữ tài liệu JSON NoSQL để lập trình viên có thể lưu dữ liệu mà không cần phải chuẩn hóa dữ liệu, thiết lập lược đồ hoặc thậm chí không cần phải . Kể từ phiên bản MySQL 5. 7 và trong MySQL 8. 0, nhà phát triển có thể lưu trữ tài liệu JSON trong một cột của bảng.

Chủ Đề