2011-05-13 36 views
5

tôi thậm chí không biết nếu gọi nó là cột được tuần tự là đúng, nhưng tôi sẽ giải thích cho mình, ví dụ, tôi có bảng cho người dùng, tôi muốn lưu trữ điện thoại của người dùng số điện thoại (điện thoại di động, nhà, văn phòng, vv), vì vậy, tôi đã suy nghĩ để tạo một cột cho từng loại số, nhưng đồng thời cũng nảy ra ý tưởng, nếu tôi lưu chuỗi json trong một cột, Vì vậy, tôi sẽ không bao giờ có một cột mà có lẽ sẽ không bao giờ được sử dụng và tôi có thể biến chuỗi đó thành một mảng php khi đọc dữ liệu từ cơ sở dữ liệu, nhưng tôi muốn nghe hàng hóa và xấu của thực hành này, có thể nó chỉ là một ý tưởng tồi, nhưng trước tiên tôi muốn biết người khác phải nói gì vềcột json so với nhiều cột

cảm ơn

Trả lời

8

Trả lời ngắn gọn, Nhiều cột.

dài trả lời:

Đối với tình yêu của tất cả những gì là thánh trên thế giới xin đừng lưu trữ mutiple bộ dữ liệu trong một cột văn bản duy nhất

Tôi giả sử bạn sẽ có một bảng mà một trong hai sẽ

+------------------------------+  +----------------------+ 
| User | cell | office | home | OR | User | JSON String | 
+------------------------------+  +----------------------+ 

Trước tiên, tôi sẽ nói cả hai giải pháp này không phải là giải pháp tốt nhất nhưng nếu bạn chọn từ hai giải pháp đầu tiên là tốt nhất. Có một vài lý do chủ yếu mặc dù khả năng sửa đổi và truy vấn cụ thể là thực sự quan trọng. Hãy suy nghĩ về algrothim để thay đổi tùy chọn thứ hai.

SELECT `JSON` FROM `table` WHERE `User` = ? 

Then you have to do a search and replace in either your server side or client side language 

Finally you have to reinsert the JSON string 

Giải pháp này tổng cộng 2 truy vấn và thuật toán tìm kiếm và thay thế. Không tốt!

Bây giờ hãy nghĩ về giải pháp đầu tiên.

SELECT * FROM `table` WHERE `User` = ? 

Then you can do a simple JSON encode to send it down 

To modify you only need one Query. 

UPDATE `table` SET `cell` = ? WHERE `User` = ? 

to update more than one its again a simple single query 

UPDATE `table` SET `cell` = ?, `home` = ? WHERE `User` = ? 

Đây rõ ràng là tốt hơn nhưng nó không phải là tốt nhất

Có một giải pháp thứ ba Giả sử bạn muốn có một người sử dụng để có thể chèn một số vô hạn các số điện thoại.

Cho phép sử dụng bảng quan hệ cho điều đó để bây giờ bạn có hai bảng.

   +-------------------------------------+ 
+---------+ |  Phone       | 
| Users | +-------------------------------------+ 
+---------+ | user_name| phone_number | type  | 
| U_name | +-------------------------------------+ 
+---------+ 

Bây giờ bạn có thể truy vấn tất cả các số điện thoại của một người dùng với một cái gì đó như thế này

Bây giờ bạn có thể truy vấn bảng thông qua một tham gia

Người dùng SELECT. , điện thoại. TỪ Điện thoại, Người dùng WHERE phone.user_name =? AND Users.U_name =?

Chèn cũng dễ dàng và việc kiểm tra kiểu cũng dễ dàng.

nhớ rằng đây là một ví dụ đơn giản nhưng thực sự SQL cung cấp một tấn năng lượng để cấu trúc dữ liệu của bạn, bạn nên sử dụng nó chứ không phải tránh nó

1

Tôi chỉ làm điều này với dữ liệu không cần thiết, ví dụ: màu yêu thích của người dùng, loại mô hình yêu thích (rõ ràng là 'không cần thiết' là để bạn quyết định). Vấn đề với việc này cho dữ liệu cần thiết (số điện thoại, tên người dùng, email, tên, họ, vv) là bạn giới hạn bản thân với những gì bạn có thể thực hiện với cơ sở dữ liệu. Chúng bao gồm các trường chỉ mục, sử dụng mệnh đề ORDER BY, hoặc thậm chí tìm kiếm một đoạn dữ liệu cụ thể. Nếu sau này bạn nhận ra rằng bạn cần thực hiện bất kỳ nhiệm vụ nào trong số này, nó sẽ là một cơn đau đầu lớn.

Tốt nhất của bạn trong trường hợp này là sử dụng bảng quan hệ cho 1 đến nhiều đối tượng - ví dụ: UserPhoneNumbers. Nó sẽ có 3 cột: user_id, phone_numbertype. user_id cho phép bạn liên kết các hàng trong bảng này với hàng bảng thích hợp User, phone_number tự giải thích và type có thể là 'nhà riêng', 'ô', 'văn phòng', v.v. Điều này cho phép bạn vẫn thực hiện các tác vụ tôi đã đề cập ở trên, và nó cũng có lợi ích bổ sung không lãng phí không gian trên các cột trống, vì bạn chỉ thêm các hàng vào bảng này khi bạn cần.

Tôi không biết làm thế nào bạn đang quen thuộc với MySQL, nhưng nếu bạn chưa nghe nói về bình thường hóa cơ sở dữ liệu và truy vấn tham gia, bây giờ là một thời điểm tốt để bắt đầu đọc lên trên chúng :)

Hope this helps .

0

Tôi không chắc những lợi thế của phương pháp này sẽ là gì. Bạn nói "Vì vậy, tôi sẽ không bao giờ có một cột có thể sẽ không bao giờ được sử dụng ..." Những gì tôi nghĩ rằng bạn có nghĩa là (trong hệ thống của bạn) mà đôi khi người dùng có thể không có một giá trị cho mỗi loại số điện thoại có sẵn, và đó là trường hợp, tại sao lưu trữ hồ sơ với các cột trống?

Lưu trữ các bản ghi với một số cột trống không nhất thiết là xấu. Tuy nhiên, nếu bạn muốn chuẩn hóa cơ sở dữ liệu của mình, bạn có thể có một bảng riêng cho user_phonenumber và tạo mối quan hệ 1: nhiều giữa các bản ghi useruser_phonenumber. Bảng user_phonenumber về cơ bản sẽ có bốn cột:

  • id (khóa chính)
  • userid (khóa ngoại đến bảng người dùng)
  • loại (ví dụ điện thoại di động, nhà, văn phòng, vv)
  • giá trị (số điện thoại)

Ràng buộc sẽ là id đó là khóa chính, userid là khóa ngoại cho user.id và loại sẽ là enum (tất cả các loại số điện thoại có thể).

2

Nếu bạn làm việc với json, có nhiều cách thanh lịch hơn MySQL. Đề xuất sử dụng Cơ sở dữ liệu khác hoạt động tốt hơn với json, như mongoDB hoặc trình bao bọc cho SQL như Persevere, http://www.persvr.org/Documentation (xem "Perstore")

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