寫在前面:
我非常慶幸的事 在前公司接觸過一些表結(jié)構(gòu)的知識和簡單的SQL甚亭,后端產(chǎn)品經(jīng)理越想進階俭尖,數(shù)據(jù)結(jié)構(gòu)化的思維就越發(fā)重要(感覺大學概率與數(shù)理統(tǒng)計沒好好學真是不應(yīng)該)低散,今天和架構(gòu)師爭執(zhí)的流程诊县,唯一沒有diss成功的地方桨昙,就在于流程設(shè)計雖然更簡潔检号,卻無從取數(shù),所以今天跳出促銷蛙酪,補一補表結(jié)構(gòu)
提升產(chǎn)品經(jīng)理“技術(shù)思維”:學習數(shù)據(jù)表結(jié)構(gòu)知識
產(chǎn)品轉(zhuǎn)技術(shù)難度比較大齐苛,學習數(shù)據(jù)表結(jié)構(gòu)就門檻低很多,對產(chǎn)品設(shè)計的作用也很明顯桂塞。本文會簡單介紹一些產(chǎn)品設(shè)計中會用到的數(shù)據(jù)表結(jié)構(gòu)方面的思考凹蜂,希望對各位有所幫助。
程序是怎么運行的呢?
簡單來說玛痊,就是去指定的位置(表)取數(shù)據(jù)汰瘫,完成運算,放到指定的位置(表)存起來或展示出來卿啡。
那么吟吝,怎么保證取到的/存到的數(shù)據(jù)是按我們預想的方式來的呢?這就涉及到表結(jié)構(gòu)問題了颈娜。
數(shù)據(jù)表是由表名剑逃、表中字段、字段內(nèi)容組成官辽。本文主要圍繞字段劃分及字段定義兩個部分蛹磺,介紹在產(chǎn)品設(shè)計中需要用到的表結(jié)構(gòu)知識。
一同仆、字段分類
要完成一個流程(運算)萤捆,我們需要諸多數(shù)據(jù)(字段),這么多字段是一張表還是多張表呢俗批?
我們可以以商品上架為例俗或,簡單分析一下。
比方說岁忘,倉庫現(xiàn)在還有可口可樂50個辛慰,進價2.5元,售價3.5元干像。
1號貨架只剩5個可樂帅腌,小王在19/6/24日15:20:12向該貨架上架20個,預計放在貨架第4層麻汰;因為新貨架促銷速客,打折價3元。
首先五鲫,所有相關(guān)信息排列:
實際業(yè)務(wù)會比這個字段更多溺职,全在一張表里儲存雖然看上去清晰,但是缺點也很明顯——因為將主體相關(guān)的屬性臣镣、流水辅愿、維度等數(shù)據(jù)全部混在一起,勢必造成大量的數(shù)據(jù)冗余忆某。
我們按數(shù)據(jù)類型拆為屬性表和流水表点待。
其中屬性表分為商品SKU和貨架;流水表為上架操作過程弃舒。整理后如下:
首先癞埠,看一下商品表:
(1)商品屬性(類別状原,名稱等)跟商品流水(進貨、出貨)混在一起苗踪,可以進一步拆分颠区。
(2)“倉庫剩余個數(shù)”,可能進貨的要改通铲、上架的要改毕莱、盤點的要改,多個地方都會對這個字段作用颅夺。這種情況可以通過實時計算朋截,比寫入覆蓋的方式更為準確。
所以調(diào)整后會改為:
注:前臺展示的余量實時計算吧黄,不落表部服。
可以看到商品流通和之前的上架表非常類似,只相差一個貨架編號拗慨。
假設(shè)我們把倉庫看做一個大貨架廓八,設(shè)為0,兩表合并整理后:
再來看貨架表赵抢,“商品種類數(shù)”適用實時計算剧蹂,不落表。(類似前文倉庫余量計算)烦却。
還有一個問題非常突出——商品詳情這欄內(nèi)容特別多国夜。
非結(jié)構(gòu)化數(shù)據(jù),不便處理短绸,且與其他表內(nèi)容重復(比如商品名稱和售價)。同樣的字段最好只在一個地方維護筹裕,避免表之間的數(shù)據(jù)沖突醋闭。商品名稱很明顯放在商品屬性里。
那售價這個字段應(yīng)該放在商品還是貨架上的商品詳情朝卒?
這其實跟業(yè)務(wù)模式相關(guān)证逻,放在商品里方便全局管理,但是單個貨架不能實現(xiàn)差別化定價抗斤;相反囚企,放在貨架上,同一商品在不同貨架上可以設(shè)置不同售價瑞眼,缺點是修改調(diào)整比較困難龙宏。
根據(jù)我們的業(yè)務(wù)情況,售價主要是統(tǒng)一管理伤疙,放在了商品屬性银酗;折扣主要是單個貨架進行辆影,所以折扣價放在了貨架的商品詳情。
調(diào)整后如下:
數(shù)據(jù)結(jié)構(gòu)確認之后黍特,頁面內(nèi)容設(shè)計就比較清晰了:
【商品】
【貨架】
【貨架詳情】
【商品流轉(zhuǎn)】
注:在實際產(chǎn)品中蛙讥,頁面入口可能帶有一些參數(shù),比如上圖如果是點擊“進貨”按鈕的彈出框灭衷,就無需再手動選擇交易類型次慢。
二、字段類型
前面從大的范圍上介紹了字段的劃分翔曲,細節(jié)上單個字段的類型迫像、長度也需要加以關(guān)注。
一些常用的字段類型:
在字段類型上部默,我也遇到過一些坑侵蒙,舉兩個例子說明一下:
我在P2P公司上班,用戶會發(fā)布很多借款傅蹂,有個字段是表示借款類型纷闺,比如listingtype。
我們絕大多數(shù)的標都是普通標份蝴,穿插一點點其他類型犁功。總類型不超過5種婚夫,所以當時字段類型是tinyint浸卦,范圍0-255。
后來有段時間我司發(fā)展與合作機構(gòu)的合作標案糙,當時我做配置系統(tǒng)限嫌,設(shè)計成每個合作單位分配一個listingtype。
跑著跑著有一天时捌,研發(fā)反應(yīng)過來了怒医,說:總數(shù)就255,你再加就爆了奢讨。
后來的解決辦法是將合作標統(tǒng)一一個listingtype稚叹,然后同一類型下,每家單位再各自分配一個sublistingtype拿诸。
再舉一個例子扒袖,還是這個合作標的時候,上線之后亩码,利息計算錯誤季率。研發(fā)查了一圈,是建表的時候利率字段用了默認的DECIMAL(18,0)蟀伸,導致導入數(shù)據(jù)時被四舍五入蚀同。
三缅刽、總結(jié)
當然,你可以說:表結(jié)構(gòu)不是研發(fā)自定義的嗎蠢络?但這也不能全是研發(fā)的鍋衰猛,一是研發(fā)可能不清楚整個產(chǎn)品的規(guī)劃,或者說隨著業(yè)務(wù)變化刹孔,原本適合的字段類型變得不再適合啡省。
另一方面,并不是所有產(chǎn)品都是從零開始髓霞,有的可能是后來加入進行老產(chǎn)品的版本迭代卦睹。這種產(chǎn)品在設(shè)計之前,了解原先的表結(jié)構(gòu)及字段類型方库,就能避開很多坑结序。而且相比前端展示層,數(shù)據(jù)層上的坑纵潦,一般都是大坑徐鹤,改起來也困難更多。
大家都知道邀层,產(chǎn)品有技術(shù)背景會更方便溝通返敬。技術(shù)入門也許太難,表類知識入門就簡單多了寥院。
本文拋磚引玉劲赠,希望大家能往此方向去提煉一下自己,相信會給產(chǎn)品工作帶來較大助益秸谢。
重溫SQL知識
作為一枚數(shù)據(jù)產(chǎn)品經(jīng)理凛澎,需要掌握基本的SQL查詢語句技能,之后才能進一步了解與搭建數(shù)據(jù)倉庫估蹄、元數(shù)據(jù)预厌、指標字典體系。本文首先介紹MySQL基本知識元媚。
一、了解數(shù)據(jù)庫
模式:關(guān)于數(shù)據(jù)庫和表的布局及特性的信息苗沧;
行是表中的記錄刊棕,列是字段;
主鍵列中的值不能修改待逞,且不能重用甥角;
數(shù)據(jù)庫中包含表及其它相關(guān)sql結(jié)構(gòu)。
二识樱、檢索數(shù)據(jù)
2.1 select語句
檢索所有列:select * from products
2.2 排序檢索數(shù)據(jù)
order by:select prod_name from products order by prod_name嗤无。
注意:order by的子句必須是select語句的最后一個子句震束。
按多個列排序:select prod_id,prod_name,prod_price from products order by prod_price,prod_name。那么輸出結(jié)果先按prod_price排序当犯,然后再將排序后的結(jié)果按prod_name排序垢村。
按列位置排序:select prod_id,prod_name,prod_price from products order by 2,3。語句與上一句結(jié)果相同嚎卫。
降序排序(系統(tǒng)默認升序):order by prod_price DSC,prod_name嘉栓。則結(jié)果先按prod_price降序排序,再按price_name升序排序拓诸。
三侵佃、過濾數(shù)據(jù)
(1)使用where子句(在from之后)
范圍值檢查:between and:where prod_price between 5 and 10。
空值檢查:where prod_price is NULL奠支。語句返回沒有價格的所有產(chǎn)品(空字段馋辈,不是價格為0)
(2)使用組合where子句
AND操作符:where vend AND prod_price<=4 #檢索由供應(yīng)商DLL01制造且產(chǎn)品價格低于4美元的所有產(chǎn)品注意AND用在where子句中的關(guān)鍵字,用來指示檢索滿足所給定條件的行倍谜。
OR操作符:where OR OR用在where子句中的關(guān)鍵字迈螟,用來表示檢索匹配任一給定條件的行。
AND,OR相結(jié)合(AND優(yōu)先級比OR高):所以注意使用圓括號枢劝,where (vend or vend) and prod_price>=10井联。
IN操作符:where vend_id in(‘DLL01′,’BRS01’),其功能與where or相當您旁。
NOT:否定跟在它之后的任何條件(mysql不支持此操作符)烙常, where NOT vend #檢索除DLL01之外所有供應(yīng)商的產(chǎn)品(此句等價于where vend_id <> ‘DLL01’) #NOT一定要緊跟在where后。
(3)用通配符進行過濾(通配符:用來匹配值的一部分的特殊字符鹤盒,用于“字符串”)蚕脏,使用LIKE+通配符
百分號(%):where prod_name like ‘Fish%’ #檢索任意以Fish起頭的詞(匹配單個或多個字符)。
下劃線(_ ) : where prod_name like ‘Fish__’ #檢索出的字符必須為Fish+兩個字符 (與%能匹配0個字符不一樣侦锯,_必須匹配一個字符驼鞭,不能多也不能少)。
方括號([]):where contact like [JM]% #[JM]匹配任何以J,M開頭的人名尺碰,但它也只能匹配單個字符挣棕,為此在[]后加%,則可匹配多個字符亲桥。(若改為[^JM]洛心,則為檢索不以J,M起頭的任意聯(lián)系人名,等價于:where NOT contact like [JM]%)题篷。
四词身、創(chuàng)建計算字段
(1)拼接字段(將值聯(lián)結(jié)到一起構(gòu)成單個值)
concat函數(shù)(mysql用):select concat(vend_id,’ (‘,vend_country,’)’) #select語句聯(lián)結(jié)以上4個元素。
‘+’號(Access番枚,SQL Server,Sybase使用):select vend_id + ‘ (‘ + vend_country + ‘)’法严。
‘||’號(DB2,Oracle使用):select vend_id || ‘ (‘ || vend_country || ‘)’损敷。
TRIM函數(shù):RTRIM()去掉值右邊所有空格,LTRIM()去掉值左邊所有空格深啤,TRIM()去掉值兩邊所有空格拗馒。
AS關(guān)鍵字:給聯(lián)結(jié)字段取別名。
完整聯(lián)結(jié)字段語句: select RTRIM(vend_id) + ‘ (‘ + TRIRM(vend_country) + ‘)’ AS vendor_title FROM Vendors ORDER BY vend_name墓塌。
(2)執(zhí)行算數(shù)計算
五瘟忱、使用視圖
視圖是虛擬的表,視圖本身不包含數(shù)據(jù)苫幢,因此它們返回的數(shù)據(jù)是從其他表中檢索出來的访诱,在更改這些表中的數(shù)據(jù)時,視圖將返回改變過后的數(shù)據(jù)韩肝。
(1)視圖的規(guī)則和限制
視圖可以嵌套触菜;
禁止在視圖查詢時使用ORDER BY語句。
(2)創(chuàng)建視圖(creat view)
利用視圖簡化復雜的聯(lián)結(jié)哀峻;
用視圖重新格式化檢索出的數(shù)據(jù)涡相;
用視圖過濾不想要的數(shù)據(jù)(where子句);
使用視圖與計算字段剩蟀。
六催蝗、使用存儲過程
為以后的使用而存儲一條或多條SQL語句的集合。
七育特、管理事務(wù)處理
(1)什么是事務(wù)處理
事務(wù)管理用來管理必須成批執(zhí)行的SQL操作丙号,以保證數(shù)據(jù)庫不包含不完整的操作結(jié)果。利用事務(wù)處理缰冤,可以保證一組數(shù)據(jù)不會中途停止犬缨,它們或者作為整體執(zhí)行,或者完全不執(zhí)行(除非明確指示)棉浸。
如果沒有錯誤發(fā)生怀薛,則整組語句寫到數(shù)據(jù)庫表,如果發(fā)生錯誤迷郑,則進行回退(撤銷)以恢復數(shù)據(jù)庫到某個已知且安全的狀態(tài)枝恋。
(2)幾個術(shù)語
事務(wù)(transction):一組SQL語句;
回退(rollback):指撤銷指定SQL語句的過程嗡害;
提交(commit):指將未存儲的SQL語句結(jié)果寫入數(shù)據(jù)庫表鼓择;
保留點(savepoint):指事務(wù)處理中設(shè)置的臨時占位符,你可以對它發(fā)布回退(與回退整個事務(wù)處理不同)就漾。
(3)可以回退哪些語句
可管理INSERT,UPDATE念搬,DELETE語句抑堡,不能回退SELECT語句也不能回退CREATE摆出,DROP操作。事務(wù)處理中可以使用這些語句首妖,但回退時它們不被撤銷偎漫。
(4)控制事務(wù)處理
創(chuàng)建占位符:
mysql:savepoint delete1;
sql server:save trasaction delete1; #delete1為此占位符的名字有缆。
rollback:#撤銷整個事務(wù)處理
rollback to delete1;
rollback transaction delete1;#回退到保留點delete1;
八浸踩、使用游標(cursor)
游標不是一條select語句肘习,而是被該語句檢索出來的結(jié)果集,在存儲了游標之后,應(yīng)用程序可以根據(jù)需要滾動或瀏覽其中的數(shù)據(jù)边篮。游標主要用于交互式應(yīng)用,其中用戶需要滾動屏幕上的數(shù)據(jù)循头,并對數(shù)據(jù)進行瀏覽或更改略吨。
聲明:declare
打開:open cursor
檢索:fetch… into…
關(guān)閉:close
九、了解高級SQL特性
約束:管理如何插入或處理數(shù)據(jù)庫數(shù)據(jù)的規(guī)則
主鍵:一種特殊約束
外鍵:可幫助防止意外刪除曼验,唯一約束:與主鍵類似但區(qū)別于主鍵
希望讀完的你也有所收獲
原文:http://www.woshipm.com/pmd/2521501.html
http://www.woshipm.com/pmd/1161098.html