Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lưu trữ csv trong trường MySQL - ý tưởng tồi?

Bạn không muốn lưu trữ giá trị ở dạng được phân tách bằng dấu phẩy.

Hãy xem xét trường hợp khi bạn quyết định kết hợp cột này với một số bảng khác.

Hãy xem xét bạn có,

x  items
1  1, 2, 3
1  1, 4
2  1

và bạn muốn tìm các giá trị riêng biệt cho mỗi x, tức là:

x  items
1  1, 2, 3, 4
2  1

hoặc có thể muốn kiểm tra xem nó có 3 trong đó không

hoặc có thể muốn chuyển chúng thành các hàng riêng biệt:

x  items
1  1
1  2
1  3
1  1
1  4
2  1

Đó sẽ là một ĐAU LỚN.

Sử dụng nguyên tắc đầu tiên chuẩn hóa ít nhất - có hàng riêng biệt cho mỗi giá trị.

Bây giờ, giả sử ban đầu bạn có cái này khi bạn lập bảng:

x  item
1  1
1  2
1  3
1  1
1  4
2  1

Bạn có thể dễ dàng chuyển đổi nó thành các giá trị csv:

select x, group_concat(item order by item) items
from t
group by x

Nếu bạn muốn tìm kiếm xem x =1 có mục 3. Dễ dàng.

select * from t where x = 1 and item = 3

mà trong trường hợp trước đó sẽ sử dụng khủng khiếp find_in_set :

select * from t where x = 1 and find_in_set(3, items);

Nếu bạn nghĩ rằng bạn có thể sử dụng like với các giá trị CSV để tìm kiếm, thì trước tiên hãy like %x% không thể sử dụng các chỉ mục. Thứ hai, nó sẽ tạo ra kết quả sai.
Giả sử bạn muốn kiểm tra xem mục ab có hiện diện hay không và bạn thực hiện %ab% nó sẽ trả về các hàng có abc abcd abcde .....

Nếu bạn có nhiều người dùng và mục, thì tôi khuyên bạn nên tạo bảng users riêng biệt với một userrid PK, một items khác với PK itemid và cuối cùng là bảng ánh xạ user_item có các cột userid, itemid.

Nếu bạn biết bạn sẽ chỉ cần lưu trữ và truy xuất các giá trị này và không thực hiện bất kỳ thao tác nào trên đó như nối, tìm kiếm, phân biệt, chuyển đổi thành các hàng riêng biệt, v.v. - có thể chỉ là, bạn có thể (tôi vẫn không 't).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiển thị tất cả các bảng bên trong cơ sở dữ liệu MySQL bằng PHP?

  2. Cách lấy bản ghi từ 10 phút qua trong MySQL

  3. Câu lệnh chuẩn bị sẵn Mysqli (ngăn chặn tiêm SQL)

  4. Nhận các bản ghi có giá trị tối đa cho từng nhóm kết quả SQL được nhóm lại

  5. Một bảng có thể có hai khóa ngoại không?