10/10/2018, 11:41

[help] tạo DB cho phần mềm quản lý điểm

DB của mình có các trường ma_mon; ten_mon;diem_15p;diem_1tiet ; diem_mieng; vậy làm thế nào để cho 1 trường nó có thể nhập vao nhiều đầu điểm ?
ai biết chỉ giùm mình
sonnb viết 13:57 ngày 10/10/2018
Trường dạng varchar. Lưu diem1,diem2,diem3. Lấy ra thì explode lại.
hacker0803 viết 13:42 ngày 10/10/2018
Được gửi bởi sonnb
Trường dạng varchar. Lưu diem1,diem2,diem3. Lấy ra thì explode lại.
ý mình nó là thế này :
mình có cột "diem_15p" thì trong cái cột đó có thể nhập nhiều đầu điểm được không (vd:8;9;10...) hay chỉ nhập được 1 đầu điểm , muốn nhập nữa phải tạo bản ghi mới !
bạn giải thích giùm mình!
Adam viết 13:55 ngày 10/10/2018
Được gửi bởi sonnb
Trường dạng varchar. Lưu diem1,diem2,diem3. Lấy ra thì explode lại.
Nếu làm thế này sẽ có trường hợp: có 4 lần kiểm tra 15 phút nhưng học sinh A chỉ vì bị bệnh nên chỉ tham gia kiểm tra 15' lần thứ tư.Như vậy 3 lần kiểm tra trước thì người này ko có điểm,hoặc sẽ có trường hợp học sinh chỉ tham gia lần kiểm tra thứ 1 và thứ 4.Như vậy khi explode ra phải xử lý để biết chính xác các lần tham gia kiểm tra và số điểm tương ứng.
dokhacluan viết 13:55 ngày 10/10/2018
Được gửi bởi hacker0803
ý mình nó là thế này :
mình có cột "diem_15p" thì trong cái cột đó có thể nhập nhiều đầu điểm được không (vd:8;9;10...) hay chỉ nhập được 1 đầu điểm , muốn nhập nữa phải tạo bản ghi mới !
bạn giải thích giùm mình!
tớ nghĩ thế này , giả sử 1 năm có 8 lần kiểm tra 15 phút thì lưu dưới dạng

8_9_4_2_6_7_5_5
cái chuỗi đó có nghĩa là
lần kiểm tra 15' 1 : 8 điểm
lần kiểm tra 15' 2 : 9 điểm
lần kiểm tra 15' 3 : 4 điểm
lần kiểm tra 15' 4 : 2 điểm
lần kiểm tra 15' 5 : 6 điểm
lần kiểm tra 15' 6 : 7 điểm
lần kiểm tra 15' 7 : 5 điểm
lần kiểm tra 15' 8 : 5 điểm
khi cậu lấy được chuỗi điểm "diem_15p" cậu explode ra mảng

$m=explode("_",$row['diem_15p']);
sau đó cậu dùng vòng lặp for chạy cái mãng $m để tiếp tục xử lý

trong trường hợp học sinh bị bệnh (hoặc vì lý do nào đó ko kiểm tra) thì thay vì lưu số , cậu lưu là 'ckt' ('ckt' nghĩa là "chưa kiểm tra")

giả sử lần thứ 3 và 6 học sinh chưa kiểm tra thì cậu lưu là

8_9_ckt_2_6_ckt_5_5
sau đó tiếp tục explode mảng ra $m -> tiếp tục xử lý
sonnb viết 13:54 ngày 10/10/2018
Được gửi bởi Adam
Nếu làm thế này sẽ có trường hợp: có 4 lần kiểm tra 15 phút nhưng học sinh A chỉ vì bị bệnh nên chỉ tham gia kiểm tra 15' lần thứ tư.Như vậy 3 lần kiểm tra trước thì người này ko có điểm,hoặc sẽ có trường hợp học sinh chỉ tham gia lần kiểm tra thứ 1 và thứ 4.Như vậy khi explode ra phải xử lý để biết chính xác các lần tham gia kiểm tra và số điểm tương ứng.
Đấy là bước cơ bản ban đầu thôi. Thực ra có thể dùng serialize để lưu cả array vào. Ví dụ lưu: array('lần 1'=>2,'lần 2=>5)... lúc đó thì tha hồ không sợ. VBB cũng dùng serialize.
hacker0803 viết 13:45 ngày 10/10/2018
Được gửi bởi sonnb
Đấy là bước cơ bản ban đầu thôi. Thực ra có thể dùng serialize để lưu cả array vào. Ví dụ lưu: array('lần 1'=>2,'lần 2=>5)... lúc đó thì tha hồ không sợ. VBB cũng dùng serialize.
2 bạn nói cao siêu quá mình không hiểu
các bạn có thể làm cho mình cái DB ví dụ đc không , thanks bạn trước !
kientre viết 13:56 ngày 10/10/2018
cái DB thì cơ bản giữ nguyên như của bạn thôi. Các bác trên đang giải thích các để cho bạn xử lý đơn giản nhất có thể nhập nhiều điểm 15 phút mà không cần tạo bản ghi
haicop viết 13:51 ngày 10/10/2018
Khuyên thật các bác không nên dùng explode, trước mắt thì nhanh nhưng khi hệ thống phức tạp cần query, bảo trì sửa chữa thì vỡ mặt
Tham khảo google : "chuẩn hóa cơ sở dữ liệu"

Về nguyên tắc của chuẩn hóa là phải chia CSDL nhỏ nhất có thể, vd cột diem15 phút thì ko nên nhập kiểu 1,2,3,4... mà phải thêm 1 table nữa, mỗi record là 1,2,3,4 ...

Lệnh join sẽ giải quyết vấn đề này đơn giản.

Các bác thử hình dung khi cần tìm kiếm tất cả các điểm 15 phút >9 , nếu nhét dạng chuỗi thì query kiểu gì ?
sonnb viết 13:53 ngày 10/10/2018
Được gửi bởi haicop
Khuyên thật các bác không nên dùng explode, trước mắt thì nhanh nhưng khi hệ thống phức tạp cần query, bảo trì sửa chữa thì vỡ mặt
Tham khảo google : "chuẩn hóa cơ sở dữ liệu"

Về nguyên tắc của chuẩn hóa là phải chia CSDL nhỏ nhất có thể, vd cột diem15 phút thì ko nên nhập kiểu 1,2,3,4... mà phải thêm 1 table nữa, mỗi record là 1,2,3,4 ...

Lệnh join sẽ giải quyết vấn đề này đơn giản.

Các bác thử hình dung khi cần tìm kiếm tất cả các điểm 15 phút >9 , nếu nhét dạng chuỗi thì query kiểu gì ?
Đấy là giải pháp đưa ra cho bạn ấy đáp ứng yêu cầu tối thiểu. Còn tất nhiên lưu riêng ra bảng khác, rồi thêm các thông tin ngày tháng... thì còn gì bằng nữa, vừa tiện lưu, vừa tiện truy xuất và tìm kiếm. Nhưng không phải lúc nào nhiều bảng cũng tốt. Đúng là không dùng explode nhiều vì nó chậm, nhưng serialize không phải là 1 ý tồi. Bạn tham khảo các source như VBB họ cũng áp dụng cái này, vì nếu tạo bảng thì nó quá nhiều.
Bài liên quan
0