mapengpeng1999@163.com 数据库的设计
糟糕的數據庫設計:
1.數據冗余、浪費空間
2.數據插入刪除很麻煩
3.程序性能差
良好的數據庫設計:
1.節省內存空間(不存在多個表中出現重復字段)
2.保證數據庫完整性
3.方便我們開發系統
軟件開發中,關于數據庫的設計
1.分析需求:分析業務和需要處理的數據庫的需求
2.概要設計:設計關系圖(E-R圖)
設計數據庫的步驟:(個人博客)
1.收集信息、分析需求
用戶表(用戶登入注銷,用戶的個人信息,寫博客,創建分類(多個人))
分類表(文章分類,誰創建的)
文章表(文章的信息)
評論表:
友情鏈接(發鏈接信息)
說說表:(發表心情,id,content,create_time)
自定義表(系統信息,某個關鍵的字,或者一些主字段) key: value
數據庫命名用下劃線區分不用大駝峰,因為數據庫不區分大小寫。
用戶表(user):id,username,password,sex,age,sign(個人簽名)
分類表(category):id(分類id),category_name(分類標題),create_user_id(創建用戶的id)
文章表(blog):id(文章id),title(文章標題),author_id(寫文章的用戶),category_id(文章分類),content(文章內容),create_time(創建時間),update_time(修改時間),love(喜歡點贊)
評論表:id(評論id),blog_id(所屬文章),user_id(評論人),content(評論內容),create_time(評論時間),user_id_parent(回復人的id)
友情鏈接表:id(友情鏈接id),links(網站名稱),href(網站鏈接),sort(排序,int型)
標識表之間的關系:
寫博客:user-blog
創建分類:user-category
關注:user-user
友情鏈接:links
評論表:user-user-blog
數據庫三大范式
第一范式:
原子性:保證每一列不可再分。
第二范式:
前提是滿足第一范式,每張表只描述一件事。
第三范式:
前提是滿足第一范式和第二范式,第三范式需要保證數據表中的每一列數據都和主鍵直接相關,而不能間接相關。
規范和性能問題
關聯查詢的表不得超過三張表
1.考慮商業化的需求和目標,(成本 用戶體驗)數據庫的性能更加重要。
2.在規范性能的問題的時候,需要適當的考慮一下規范性。
3.故意給某些表增加一些冗余的字段(從多表查詢中變為單表查詢)
4.故意增加一些計算列(從大數據量降低為小數據量的查詢:索引)
事務
要么都成功,要么都失敗。
ACID原則
原子性:要么全部完成,要么都不完成。
一致性:總數不變
隔離性:多個進程互不干擾
持久性:一旦提交不可逆,持久化到數據庫了
隔離性的問題:
臟讀:一個事務讀取了另一個沒有提交的事務
不可重復度:在同一個事務內,重復讀取表中的數據,表數據發生了改變
虛讀(幻讀):在一個事務內,讀取到了別人插入的數據,導致前后讀出來的結果不一致。
JAVA代碼實現:
1.開啟事務 conn.setAutoCommit(false);
2.一組業務sql執行完畢,提交事務
3.可以在catch語句中顯示的定義回滾語句,出現異常就回滾
數據庫連接池
數據庫連接,執行完畢,釋放。頻繁的連接釋放很浪費系統資源。
池化技術:準備好一些預先的資源,過來就連接預先準備好的
假如常用連接數10個,最小連接數就設為10個(根據常用連接數來設置的), 最大連接數:15個(業務最高承載上限)超過了就排隊等待,例如等待超時:100ms編寫連接池,實現一個接口DataSource
開源數據源實現
DBCP C3P0 Druid:阿里巴巴 使用了這些數據庫連接池之后,在項目開發中就不需要編寫連接數據庫的代碼了。 DBCP:需要用到的jar包,commons-dbcp-1.4,commons-pool-1.6 C3P0: 需要用到的jar包,c3p0-0.9.5.5,mchange-commons-java-0.2.19 總結:無論使用什么數據源,本質還是一樣的,DataSource接口不會變,方法就不會變。 數據庫中的數據類型,int后的()可省略,大小會自動在1到12之間判斷, char()長度固定的字符數浪費空間,varchar()長度不固定的字符數很靈活建議使用 date YYYY-MM-DD,日期格式 time HH:mm:ss,時間格式 datetime YYYY-MM-DD HH:mm:ss 最常用的時間格式 日期時間類型后面不加(),內容為字符串加單引號。null,空的沒有值 注意:不要使用NULL進行運算,結果為NULL關于數據庫引擎
INNODB:默認使用
MYISAM:早些年使用的
| 事務支持 | 不支持 | 支持 |
| 數據行鎖定 | 不支持(表鎖) | 支持(行鎖,效率高) |
| 外鍵約束 | 不支持 | 支持 |
| 全文索引(搜索到文章內容) | 支持 | 不支持 |
| 表空間大小(內存) | 較小 | 較大,約為MYISAM的2倍 |
常規的使用操作:
MYISAM:節約空間,速度較快
INNODB:安全性高,支持事物的處理,支持外鍵就支持多表多用戶操作。
在物理空間存放的位置:
所有的數據庫文件都存放在data目錄下,一個文件夾就是一個數據庫,本質是文件的存儲。
在隱藏目錄(C:\ProgramData)C:\ProgramData\MySQL\MySQL Server 5.5\data下
MYSQL引擎在物理文件上的區別:
INNODB:在數據庫表中只有一個*.frm文件,以及上級目錄下的ibdata1文件 MYISAM對應文件:*.frm 表結構的定義文件 *.MYD 數據文件(data)*.MYI 索引文件(index)設置數據庫的字符集編碼
CHARSET=utf8 不設置的話,會是mysql默認的字符集編碼(不支持中文) MYSQL的默認編碼是Latin1,不支持中文 在my.ini中配置默認的編碼 character-set-server=utf8 不建議這樣操作,把物理文件改了,只能在我電腦不亂碼,在別人電腦一樣亂碼 所有的創建和刪除操作盡量加上判斷 drop table if exists teacher; create table if not exists teacher;外鍵(物理外鍵,數據庫級別的外鍵,不建議使用,避免數據庫過多造成困擾) 1.表與表之間有聯系刪除很麻煩。2.表多外鍵多就很亂。 constraint給外鍵起個別名,references引用 1.創建表時添加外鍵,不能兩個表同時在創建時添加外鍵, 因為另外一個表還沒有創建這個表就無法關聯上另外那個表的字段。 2.創建后添加外鍵:(建表的時候最好不加約束,需要的時候再添加) alter table student add constraint FK_gradeid foreign key(gradeid) references grade(gradeid); 刪除有外鍵關系的表時,必須先刪除引用別人的表(從表),再刪除被引用的表(主表) alter table 給哪個表加外鍵 add constraint 給外鍵約束起個別名 foreign key(作為外鍵的列) references 引用哪個表(引用哪個表中的哪個字段)總結: 1.數據庫就是單純的表,只用來存數據,只有行(數據)和列(字段) 2.如果想使用多張表的數據,想使用外鍵(用程序去實現) 不能使用外鍵與級聯,一切外鍵概念必須用JAVA代碼解決。 原因:每次做DELETE和UPDATE都必須考慮外鍵約束會很麻煩。數據庫的意義:數據存儲,數據管理。
DML語言:數據操作語言,insert,update,delete
insert into 表名(字段1,字段2,字段3...) values (值1,值2,值3...); 可以只插入某些指定字段: insert into grade(gradename) values ('大四'); 主鍵自增就可以省略添加的主鍵字段。 如果不寫添加表的字段,默認給表中所有的字段添加值。 寫插入語句,一定要數據和字段一一對應。 插入多個字段:一定要數據和字段一一對應。 insert into student(name,age,sex) values ('大四',21,'女'), ('大三',20,'女'),('大二',18,'男'); update修改 update student set name = '馬鵬鵬' where id = 1; 帶有修改條件 update student set name = '馬鵬鵬'; 會改動所有的表 update student set name = '馬鵬鵬',email='mpp_123@163.com' where id = 1; 修改多個屬性用逗號隔開 MYSQL中不等于號有<>和!=兩種,BETWEEN AND為閉區間。delete刪除 delete from student;刪除全部表數據,避免這樣寫 delete from student where id = 1;刪除指定數據 truncate清空 作用:完全清空一個數據庫表,表結構和索引約束不會變(表結構和索引delete清空也不會變) 清空表: truncate student; delete刪除和truncate清空區別: 相同點:都能刪除數據,都不會刪除表結構。 不同點: truncate清空,會重新設置自增列,計數器會歸零。不會影響事務。 delete刪除的問題,就是在重啟數據庫會發現這么一個現象: 如果引擎是INNODB,自增列會從1開始(存儲在內存中,斷電即失,沒有持久化) 如果引擎是MYISAM,自增列繼續從上一個自增量開始(存儲在文件中的,不會丟失)DQL數據查詢語言:
分析需求,分析查詢的字段來自哪些表(2張表就要連接查詢) 確定使用哪種連接查詢? 自連接:自己和自己連接索引:
索引:幫助MYSQL高效快速獲取數據的數據結構。 索引在小數據量的時候,用途不大,但是在大數據量的時候,區別十分明顯。 在一個表中,主鍵索引只能有一個,唯一索引可以有多個。索引的分類: 主鍵索引(PRIMARY KEY):唯一標識,主鍵不可重復,只能有一個列作為主鍵 唯一索引(UNIQUE KEY):避免重復的列出現,唯一索引可以重復,多個列都可以標識為唯一索引 常規索引(KEY/INDEX):默認的,可以用index或key關鍵字來設置 全文索引(fullText):在特定的數據庫引擎下才有,MyISAM。快速定位數據索引原則:
1.索引不是越多越好 2.不要對進程變動數據加索引 3.小數據量的表不需要加索引 4.索引一般加在常用來查詢的字段上索引的數據結構:
http://blog.codinglabs.org/articles/theory-of-mysql-index.html
MYSQL備份:
為什么要備份:
保證重要的數據不丟失
數據轉移
MYSQL數據庫備份的方式:
1.直接拷貝物理文件
在隱藏目錄(C:\ProgramData)C:\ProgramData\MySQL\MySQL Server 5.5\data下
2.在Sqlyog這種可視化工具中手動導出
在想要導出的表或者庫中,右擊,選擇備份或導出。
3.使用命令行導出 mysqldump 命令行的使用
總結
以上是生活随笔為你收集整理的mapengpeng1999@163.com 数据库的设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于Win10创意者更新之后蓝屏的修复办
- 下一篇: mysql盲注_Mysql 布尔型盲注手