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