
Thiết kế cơ sở vật chất dữ liệu là việc tổ chức dữ liệu theo một mô phỏng cơ sở vật chất dữ liệu . Người thiết kế xác định dữ liệu nào phải được lưu trữ và cách những phần tử dữ liệu liên kết với nhau. Với thông tin này, họ mang thể khởi đầu khớp dữ liệu với mô phỏng cơ sở vật chất dữ liệu. Hệ quản trị cơ sở vật chất dữ liệu quản lý dữ liệu tương ứng.
Thiết kế cơ sở vật chất dữ liệu liên quan tới việc phân loại dữ liệu và xác định những mối quan hệ qua lại. Trình diễn lý thuyết của dữ liệu này được gọi là bản thể luận . Bản thể luận là lý thuyết đằng sau thiết kế của cơ sở vật chất dữ liệu. Nội dung hôm nay, Tmarketing sẽ hướng dẫn bạn thiết kế Database cho người mới bất đầu.
Nguyên tắc thiết kế CSDL
Trước lúc bước vào việc thiết kế Database bạn cần nắm một số nguyên tắc quan yếu sau:
- Chuẩn xác
- Tránh trùng lặp
- Dễ hiểu
- Chọn đúng tính chất và kiểu tính chất
- Chọn đúng mối quan hệ
Những bước thiết kế Database chuẩn
Thiết kế database, hay cũng như thiết kế Một phần mềm, một trang web, đều khởi đầu mang thứ tự gồm những bước cơ bản:
- Phân tích yêu cầu.
- Phác thảo ý tưởng ra giấy, làm bản mẫu.
- Thực hiện.
Phân tích yêu cầu
Đây chắc hẳn là bước mà một lập trình viên chưa mang nhiều kinh nghiệm (như mình chẳng hạn) ít chú tâm nhất. Ko cần phải nói thêm về tầm quan yếu của giai đoạn này, lúc đi làm được một thời kì bạn sẽ thấy code thực sự ko khó, maintain và thay đổi theo những nhu cầu của khách hàng còn khó hơn gấp vạn lần. Bạn sẽ phải dần dần thay đổi tư duy. Lập trình viên ko phải là đâm đầu vào code mà ko cần biết chuyện gì đang xảy ra, hãy suy nghĩ như những product manager, hãy suy nghĩ như mình là người tạo ra sản phẩm đó.
Rồi, mở đầu với database, ở đây là MySQL, rất phổ biến, hầu như người nào cũng xài, hầu như người nào cũng nghĩ nó dễ, mà hầu như người nào cũng ko nắm hết về nó. Ở đây, mình ko quan tâm bạn sử dụng giao diện hay command line, vì đằng nào cũng ra kết quả như nhau.
Xác định yêu cầu một cách đầy đủ, cụ thể sẽ tạo điều kiện cho việc thiết kế CSDL trở lên thuận tiện hơn. Luôn đặt ra thắc mắc:
- CSDL sẽ được sử dụng như thế nào?
- Những thông tin gì cần được lưu vào CSDL?
Chúng ta mang thể tham khảo những hệ thống dữ liệu sẵn mang. Mang thể là trong hoá đơn bán hàng, tập lưu trữ hồ sơ khách hàng.. vv.v.v
Phác thảo ý tưởng
Mang thể bạn ung dung lúc hiện tại mang rất nhiều tool thiết kế database offline lẫn online, tuy nhiên, ko gì thoải mái hơn phương tiện truyền thống là bút chì và giấy. Hãy cầm lên và vẽ ra, bạn cần bao nhiêu bảng, liên kết với nhau như thế nào, liệu bảng nào nên tách ra riêng, bảng nào cần nhiều cột, bảng nào cần ít cột. Đây là giai đoạn tốn thời kì nhất. Hãy nghĩ ra tất cả những trường hợp mang thể.
Thực hiện
- Việc trước tiên là tạo database, công việc mang vẻ đơn thuần, tuy nhiên sẽ mang vài thứ cần chú ý. Điều trước tiên đó chính là bạn phải xác định rõ ứng dụng của mình, nhu cầu đọc nhiều hơn hay là thêm sửa xóa nhiều hơn. Nếu đọc nhiều hơn, nên thiết kế ít bảng và mang nhiều thông tin, nhiều cột hơn, nếu thêm/sửa/xóa là chủ yếu, hãy thiết kế nhiều bảng và trong mỗi bảng, dữ liệu được chuẩn hóa. Dòng này phụ thuộc vào tư duy của người thiết kế.
- Tiếp theo đó là charset và collation, chúng luôn đi với nhau. Charset hiểu nôm na là tập hợp những ký tự (giống như bảng chữ dòng) và dạng mã hóa của nó. Collation là tập hợp những quy tắc để so sánh những ký tự trong charset, thực chất là so sánh dạng đã mã hóa của nó. Tài liệu chính thống của MySQL đã nói rất rõ ở đây. Charset và collation cần được để tâm lúc bạn làm database của những hệ thống đa tiếng nói, hoặc lưu những ký tự đặc trưng ví dụ như tiếng Việt. utf8 charset với utf8_general_ci và utf8_unicode_ci collation đều làm tốt hai việc này và so sánh giữa hai loại collation này
- Xong, tiếp tới là tạo bảng. Cũng như việc tạo database, hầu hết chúng ta đều tạo với những thiết lập mặc định mà hệ thống làm cho, mà chẳng quan tâm gì những thiết lập đó mang tức thị gì. Mình sẽ kể ra những thứ nên được chú tâm để thiết kế một database chuẩn, và thuận tiện tối ưu hết sức mang thể. Đã tới lúc bạn để tâm tới dòng gọi là storage engine của bảng. Trong kipalog cũng mang Một bài bàn về vấn đề này, bạn mang thể xem ở đây. Mình chỉ bổ sung một tẹo cho dễ hiểu.
- Với những mục đích thông thường, ta nên sử dụng InnoDB. Lúc một dòng được thêm/sửa, thì MySQL sẽ chỉ khóa ko cho những process khác thao tác với dòng đó, được gọi là row level lock, mọi thao tác với những dòng khác vẫn diễn ra thường nhật, bởi vậy InnoDB mang đặc tính gọi là Concurrency, vì những process khác ko phải chờ lúc dòng đó được hoàn thành. MyISAM thì chỉ tương trợ table level lock, bạn sẽ khắc hiểu là MySQL sẽ khóa toàn bộ bảng lúc thao tác với Một dòng, và sẽ ko hợp lý lúc ứng dụng của bạn cần tương trợ nhiều thao tác đồng thời. Memory engine hiện tại ko được sử dụng nhiều, thay vào đó là Redis hay Memcached. Archive engine thích hợp để lưu log, tuy nhiên cách lưu log sử dụng bảng hay sử dụng file, và lưu thế nào sẽ là một bài toán khác.
Tiếp theo là tạo những cột cần thiết cho bảng, và điều khôn cùng quan yếu là kiểu dữ liệu, hãy sử dụng kiểu số nguyên lúc mang thể, kiểu tháng ngày thì nên sử dụng DATETIME ngoại trừ một vài field sử dụng TIMESTAMP để lưu lại thời khắc.
Cụ thể:
- Xoành xoạch lưu một cột là người tạo để biết là người nào tạo dòng này, một cột là ngày tạo, và ngày chỉnh sửa dòng này. Ngày tạo và ngày chỉnh sửa nên chọn kiểu dữ liệu là TIMESTAMP.
Đối với dữ liệu tháng ngày, nên lưu là DATETIME để phục vụ cho những nhu cầu sau này như đánh index, virtual column. - Tên cột càng ngắn càng tốt, dĩ nhiên phải rõ nghĩa và dễ hiểu.
Những cột ví dụ như “type”, “status”… nên chọn kiểu là số nguyên, và hãy comment cho cột đó để biết những trị giá cột đó mang thể mang, ví dụ 1:enabled, 2:disabled. Bạn đã bao giờ khóc thét lúc ko biết được Một cột tương tự mang trị giá 3 mà ko thể tìm được ở đâu cho biết rằng 3 mang tức thị gì chưa?
Default value cho cột vẫn là một cuộc tranh luận, và bạn đừng nên tin người nào cả, hãy đọc hết sức mang thể và chỉ nên tin vào yêu cầu của chính mình. - Hạn chế sử dụng kiểu dữ liệu là TEXT hết sức mang thể.
Index rất quan yếu, hãy sử dụng lúc mang thể. Lời khuyên của mình: xoành xoạch sử dụng index, đặc trưng những cột mang kiểu dữ liệu là số nguyên. - Dòng cơ bản nhất, người nào cũng biết đó là đánh index vào những cột nào xuất hiện trong điều kiện WHERE của câu truy vấn. Tuy nhiên, còn nhiều loại index khác cao cấp hơn, như covering index, merge index, hash index, index cho virtual column… Đánh index là cả một vấn đề, và nó là một cách để cải thiện tốc độ truy vấn hiệu quả nhất. Hãy thử nghĩ ra tất cả những trường hợp mang thể, hãy nghĩ xem ví dụ một lúc nào đó bạn được yêu cầu tìm kiếm Một user dựa vào email của user đó, bạn sẽ đánh index vào trường email với kiểu dữ liệu VARCHAR(50)?
- Hãy học cách rà soát câu truy vấn của mình nhanh hay chậm, tiêu biểu là sử dụng lệnh EXPLAIN. Còn rất nhiều best practice về tạo database
Hướng dẫn thực thi cơ bản với MySQL – Thiết kế Database
Notes MySQL
Video Hướng dẫn
[MySQL] Create Database, table
[MySQL] Add PRIMARY KEY, FOREIGN KEY Constraint
[MySQL] Create Database ER diagram
Create Database
https://www.w3schools.com/sql/sql_create_db.asp
CREATE DATABASE databasename; CREATE DATABASE mapping;
Lúc đặt tên nên:
- Ko dấu
- Ko khoảng trắng
- Viết thường
- Ko ký tự đặc trưng
Create Table
https://www.w3schools.com/sql/sql_create_table.asp
Cú pháp
CREATE TABLE table_name ( column1 datatype, column2 datatype, column3 datatype, .... );
Chúng ta mang thể khai báo luôn khóa chính lúc tạo bảng luôn, như thế này
CREATE TABLE Persons ( ID int NOT NULL PRIMARY KEY, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int );
Lỗi
Lỗi này do cửa sổ query ko biết nên truy vấn từ Database nào, trong mysql workbend thì ta nhấp lưu ban chuột vào Database muốn truy vấn để active nó lên
Select the default DB to be used by double-clicking its name in the SCHEMAS list in the sidebar
Thực hiện
CREATE TABLE admin( admin_id int, ward varchar(255), district varchar(255), city varchar(255) );
CREATE TABLE street( street_id int, street_type_id int, admin_id int, street_name varchar(255) );
Mình nên để mấy dòng cột liên kết (khoái ngoại, khóa chính) lên đầu bảng cho dễ quản lý
CREATE TABLE poi( poi_id int, category_id int, address_id int, admin_id int, name varchar(255) );
CREATE TABLE street_type( street_type_id int, street_type varchar(255) );
CREATE TABLE categories( category_id int, category varchar(255) );
CREATE TABLE address( addr_id int, street_id int, admin_id int, addr_no varchar(255) );
Tạo Khóa chính
https://www.w3schools.com/sql/sql_primarykey.asp
Cú pháp
Chúng ta mang thể khai báo luôn khóa chính lúc tạo bảng luôn, như thế này
CREATE TABLE Persons ( ID int NOT NULL PRIMARY KEY, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int );
Nếu đã tạo rồi thì giờ ta update lại thôi
ALTER TABLE Persons ADD PRIMARY KEY (ID);
Thực hiện
ALTER TABLE admin ADD PRIMARY KEY (admin_id); ALTER TABLE street ADD PRIMARY KEY (street_id); ALTER TABLE poi ADD PRIMARY KEY (poi_id); ALTER TABLE street_type ADD PRIMARY KEY (street_type_id); ALTER TABLE categories ADD PRIMARY KEY (category_id); ALTER TABLE address ADD PRIMARY KEY (addr_id);
Tạo Khóa ngoại, liên kết bảng
https://www.w3schools.com/sql/sql_foreignkey.asp
Cú pháp
Chúng ta mang thể khai báo luôn khóa chính lúc tạo bảng luôn, như thế này
CREATE TABLE Orders ( OrderID int NOT NULL, OrderNumber int NOT NULL, PersonID int, PRIMARY KEY (OrderID), FOREIGN KEY (PersonID) REFERENCES Persons(PersonID) );
Nếu đã tạo rồi thì giờ ta update lại thôi
Thực hiện
-- admin: Ko mang khóa ngoại -- street -- Cú pháp là ADD FOREIGN KEY ({Tên cột khóa ngoại}) REFERENCES {Tên bảng liên kết}({Khóa chính của bảng liên kết}); -- Bảng này mang Hai khóa ngoại ALTER TABLE street ADD FOREIGN KEY (street_type_id) REFERENCES street_type(street_type_id); ALTER TABLE street ADD FOREIGN KEY (admin_id) REFERENCES admin(admin_id); -- poi -- Mang 3 khóa ngoại ALTER TABLE poi ADD FOREIGN KEY (category_id) REFERENCES categories(category_id); ALTER TABLE poi ADD FOREIGN KEY (address_id) REFERENCES address(addr_id); ALTER TABLE poi ADD FOREIGN KEY (admin_id) REFERENCES admin(admin_id); -- street_type -- Ko mang khóa ngoại, nó là bảng danh mục :') -- categories -- Ko mang khóa ngoại, nó là bảng danh mục :') -- address -- Mang Hai khóa ngoại ALTER TABLE address ADD FOREIGN KEY (street_id) REFERENCES street_type(street_type_id); ALTER TABLE address ADD FOREIGN KEY (admin_id) REFERENCES admin(admin_id);
Show Diagram
https://dataedo.com/kb/tools/mysql-workbench/create-database-diagram
Một số lưu ý khác
ALTER TABLE clients ALTER COLUMN phone
CREATE TABLE Persons ( Personid int NOT NULL AUTO_INCREMENT, LastName varchar(255) NOT NULL, FirstName varchar(255), Age int, PRIMARY KEY (Personid) );
Tương tự Tmarketing đã hướng dẫn bạn cách thiết kế database chuẩn chỉnh nhất, chúc những bạn thành công! Nếu mang bất kì thắc mắc nào bạn mang thể liên hệ với Tmarketing đơn vị chuyên thiết kế website và phân phối những giải pháp về website – hosting – VPS những giải pháp về Digital Marketing để trả lời những thắc mắc nhé !