鍍金池/ 問(wèn)答/ 數(shù)據(jù)庫(kù)問(wèn)答
陌離殤 回答

express的服務(wù)器請(qǐng)求都是基于中間件,一個(gè)中間件是一個(gè)函數(shù),交互邏輯簡(jiǎn)單明了。如果前期node服務(wù)端框架沒(méi)有考慮清楚寫(xiě)到后期就會(huì)全都是各種中間件函數(shù),對(duì)于長(zhǎng)期維護(hù)是很大的挑戰(zhàn)。所以express更多的是考慮對(duì)后端功能性的整合和劃分,基于es6的class,代碼寫(xiě)出來(lái)的可讀性也會(huì)很強(qiáng)。express做后端服務(wù)器很靈活,可以前后分離,也可以后端渲染,在express之上在搭一個(gè)MVC框架也很方便取決于你的自身需要。

囍槑 回答

第一個(gè)問(wèn)題不太明晰。對(duì)于第二個(gè)問(wèn)題,點(diǎn)擊下一頁(yè)后,前端通過(guò)js代碼得到 篩選條件以及下一頁(yè)對(duì)應(yīng)的頁(yè)碼值,生成 篩選參數(shù)以及頁(yè)碼參數(shù) 通過(guò) get請(qǐng)求或其他請(qǐng)求 來(lái)訪問(wèn)后臺(tái),后臺(tái)通過(guò)附帶的 篩選參數(shù)以及頁(yè)碼參數(shù) 拼接出select語(yǔ)句 進(jìn)行下一頁(yè)的查詢(通過(guò)limit關(guān)鍵字實(shí)現(xiàn)分頁(yè)的查詢)。

菊外人 回答
下列代碼啟用,不取 model 文件,可以獲取到數(shù)據(jù)
不明白這部分是什么意思
catch證明PlantUnitModel.getPlantUnitModel().findAll這個(gè)Promise執(zhí)行了,所有錯(cuò)誤應(yīng)該是$ne,sequelize為了避免sql注入默認(rèn)不能把$ne這類(lèi)操作符當(dāng)字符串處理。
抱緊我 回答
$data = array();
foreach ($chartData as $item) {
  if (isset($data[$item['add_time']])) {
    $data[$item['add_time']]['number'] += $item['viewTime'];
  } else {
    $data[$item['add_time']] = array(
      'date' => $item['add_time'],
      'number' => $item['viewTime']
    );
  }
}
$data = array_values($data);
echo json_encode($data);
病癮 回答

思考良久,有了自己的解釋?zhuān)捎跊](méi)有看linux對(duì)socket的具體設(shè)計(jì)和實(shí)現(xiàn)代碼,不一定正確,詳情查看:https://segmentfault.com/a/11...

想要看具體實(shí)現(xiàn)的可以參考linux源碼:http://man7.org/linux/man-pag...

憶往昔 回答
select aa.* 
from item aa 
join (
    select a.product_id,a.type,min(a.price) price 
    from item a 
    join (select product_id from item where item_id in (N) ) b
    on a.product_id=b.product_id
    group by product_id,type) bb
on aa.product_id=bb.product_id and aa.type=bb.type and aa.price=bb.price;

沒(méi)用過(guò)Laravel,但是解決思路一樣的,哥子,我給你個(gè)偽代碼:

$transaction = (new Transaction());

try {
    $setBalanceResult = UserModel::model()->set('balance',-100.00);
    
    if (!$setBalanceResult) throw new \Exception('修改余額失??!');
    
    $createBalanceRecord = BalanceRecord::model()->create([
        'user_id' => $user_id,
        'content' => 'XXX使用了100元'
    ]);
    if (!$createBalanceRecord) throw new \Exception('寫(xiě)入余額日志記錄失敗');
    
    $order = Order::model()->create([
        // 這里是訂單數(shù)據(jù)
    ]);
    if (!$order) throw new \Exception('訂單創(chuàng)建失敗');
    
    // 把發(fā)消息添加到發(fā)送消息隊(duì)列程序,通過(guò)隊(duì)列任務(wù)程序從隊(duì)列里取消息發(fā)送 start
    (new Queue())
        ->sendMsg('你的余額已經(jīng)變動(dòng)')
        ->sendMsg('下單成功');
    // 把發(fā)消息添加到發(fā)送消息隊(duì)列程序,通過(guò)隊(duì)列任務(wù)程序從隊(duì)列里取消息發(fā)送 start 
    $transaction->commit(); // 沒(méi)有問(wèn)題提交事務(wù)   
} catch(\Exception $e) {
    $transaction->rollback(); // 出錯(cuò)事務(wù)回滾
    var_dump($e->getMessage()); // 打印錯(cuò)誤,具體還可以進(jìn)行異常返回到更上層
}
詆毀你 回答

1.有不確定列--->這個(gè)是沒(méi)有必要的,必須的列應(yīng)該相對(duì)固定的,如果不固定,從幾十個(gè)到幾百個(gè),你呈現(xiàn)數(shù)據(jù)的時(shí)候怎樣呈現(xiàn)?
你都不確定有哪些列,你前端頁(yè)面怎么寫(xiě)?
真要有一些可有可無(wú)的字段,你可以統(tǒng)一把它存在一個(gè)字段或另一個(gè)表中。

2.比如回復(fù)這個(gè)字段,可能有上百萬(wàn)-->回復(fù)的內(nèi)容不可能和存文章的表是同一個(gè)吧?
回復(fù)當(dāng)然是需要獨(dú)立的一個(gè)表。
當(dāng)一個(gè)字段需要存多個(gè)結(jié)果時(shí),一般這個(gè)字段的內(nèi)容會(huì)獨(dú)立到另一個(gè)表中。

3.雖然 mongodb 沒(méi)有像關(guān)系型數(shù)據(jù)庫(kù)那么多限制,但基本的設(shè)計(jì)我覺(jué)得還是得按關(guān)系型數(shù)據(jù)庫(kù)來(lái)。
你把所有東西都放到一個(gè)表中,你批量查詢的時(shí)候是應(yīng)該比較快的,但你想精確查找的時(shí)候可能很麻煩,還有就是寫(xiě)入也可能很麻煩。
比如回復(fù),如果你回復(fù)的內(nèi)容是存在文章表中的“回復(fù)”字段的話,每次添加一條回復(fù)的時(shí)候,你得把原數(shù)據(jù)先查出來(lái),再把回復(fù)數(shù)據(jù)的內(nèi)容拿出來(lái),還需要循環(huán)一遍看回復(fù)的內(nèi)容有沒(méi)有重復(fù)。

生性 回答

這是一個(gè)取舍的問(wèn)題。
在做一個(gè)項(xiàng)目的時(shí)候你為什么選擇文檔數(shù)據(jù)庫(kù)而不是關(guān)系數(shù)據(jù)庫(kù)?文檔數(shù)據(jù)庫(kù)并不是完美的,比如冗余。但是它也能提供很多關(guān)系數(shù)據(jù)庫(kù)提供不了的東西,比如水平擴(kuò)展,高性能。同樣關(guān)系數(shù)據(jù)庫(kù)也不是完美的,提供事務(wù)支持的同時(shí)就舍棄了分布式的可能性(CAP理論)。接觸得越多,你會(huì)發(fā)現(xiàn)很多這樣的特性,有些無(wú)論關(guān)系非關(guān)系數(shù)據(jù)庫(kù)都支持,有些就只能在一邊支持(或者說(shuō)一邊支持得更好)。所以什么對(duì)你是最重要的?在你選擇了最重要的特性時(shí),就可能需要在一定程度上放棄其他特性。
拿你的例子來(lái)說(shuō),JOIN在關(guān)系數(shù)據(jù)庫(kù)中是再平常不過(guò)的事情,但是你可能沒(méi)有完全了解它對(duì)性能的損傷有多大。特別是到了分布式環(huán)境下,這意味著每個(gè)結(jié)點(diǎn)要與其他所有結(jié)點(diǎn)通訊才能確定最終的結(jié)果集。雖然理論上可以做到,但是對(duì)性能的影響可以說(shuō)讓非關(guān)系數(shù)據(jù)庫(kù)的性能優(yōu)勢(shì)直接大打折扣(比如如果你的集群中有100個(gè)結(jié)點(diǎn)時(shí),每條需要JOIN的數(shù)據(jù)所在的服務(wù)器都要與其他99臺(tái)通訊才能確定結(jié)果)。因?yàn)榇蟛糠秩诉x擇非關(guān)系數(shù)據(jù)庫(kù)是希望得到水平擴(kuò)展和高性能的,如果這些對(duì)你更重要,那舍棄JOIN當(dāng)然就是必然的選擇了。那么如果不要JOIN,就必須要有冗余,所以最終的問(wèn)題變成,水平擴(kuò)展和高性能,以及數(shù)據(jù)冗余,到底哪個(gè)對(duì)你來(lái)說(shuō)更重要?如果我能容忍數(shù)據(jù)冗余,會(huì)帶來(lái)什么問(wèn)題?可以想象一下,冗余了課程信息,那么在報(bào)名過(guò)程中,有多大的可能性對(duì)課程本身做修改?常識(shí)來(lái)講可能性是很小的。所以這里的冗余除了浪費(fèi)空間外,還有很小的可能性在課程修改時(shí)造成需要大量更新,以及更新過(guò)程中的數(shù)據(jù)不一致情況。
浪費(fèi)空間會(huì)是個(gè)問(wèn)題嗎?你可能聽(tīng)說(shuō)過(guò)這樣的說(shuō)法:存儲(chǔ)空間是服務(wù)器中最廉價(jià)的部分。這點(diǎn)不多做解釋了,基本上不會(huì)太在乎空間。
大量更新和數(shù)據(jù)不一致會(huì)是個(gè)問(wèn)題嗎?會(huì),但是它有多大可能性發(fā)生?那么拿很小可能性發(fā)生的一個(gè)問(wèn)題,交換大部分時(shí)間內(nèi)性能大幅度提高,是不是更劃算?
實(shí)際應(yīng)用當(dāng)中,根據(jù)實(shí)際情況的來(lái)評(píng)估哪個(gè)更劃算,很大部分時(shí)候你會(huì)發(fā)現(xiàn),其實(shí)冗余理論上有問(wèn)題,但實(shí)際中根本沒(méi)影響,或者可以通過(guò)一些手段讓這些問(wèn)題不能造成影響。那么就可以既享受性能優(yōu)勢(shì),又不影響系統(tǒng)邏輯,這就是最好的情況。
還有一小部分時(shí)候你會(huì)發(fā)現(xiàn),冗余確實(shí)會(huì)造成嚴(yán)重的問(wèn)題,那這就是選擇范式模型的時(shí)候了。如果應(yīng)用嚴(yán)重依賴范式,那就應(yīng)該選擇在這個(gè)系統(tǒng)中選擇關(guān)系數(shù)據(jù)庫(kù)。

心癌 回答

為何不考慮下官方倉(cāng)庫(kù)安裝?自帶服務(wù)腳本啊。官方文檔了解下? https://docs.mongodb.com/mast...

而且國(guó)內(nèi)還有mongodb鏡像站,比如清華大學(xué)

囍槑 回答

我看你問(wèn)過(guò)一個(gè)類(lèi)似的問(wèn)題,也沒(méi)人回答,主要是問(wèn)題點(diǎn)描述不清楚,大家想回答也無(wú)從下手。

只能給你說(shuō)一下group by的基本用法:
group by子句中的字段,是作為分組用的,在你給的例子中有三個(gè)字段:R.WHSEID,RD.STORERKEY,RD.SKU,剩余的2個(gè)字段是計(jì)算字段,不應(yīng)該放在group by中。

使用group by子句后,select子句后的字段,只能是group by中出現(xiàn)的字段,或通過(guò)聚合函數(shù)(min,max,avg等)計(jì)算字段。
在你給的例子中:sum(RD.QTYRECEIVED)是正確的;
下面兩個(gè)字段是不正確,需要加聚合函數(shù)(min,max,avg等),因?yàn)間roup by后同一個(gè)分組存在多條數(shù)據(jù),數(shù)據(jù)庫(kù)沒(méi)法判定取哪一條記錄。
RD.QTYRECEIVED,
RD.LOTTABLE04+8/24 AS LOTTABLE04

熟稔 回答

鎖表的話體驗(yàn)不好,前端會(huì)等待太久。
建議使用消息隊(duì)列。

  1. N個(gè)人點(diǎn)擊,直接入隊(duì)列,這個(gè)是順序入的。而且無(wú)鎖,性能很高
  2. 后臺(tái)開(kāi)啟一個(gè)消費(fèi)者進(jìn)程從消息隊(duì)列讀取,這個(gè)時(shí)候的順序就是你要的順序

隊(duì)列 - 先進(jìn)先出(FIFO,first in first out)

空痕 回答

當(dāng)你跳轉(zhuǎn)到訂單頁(yè)面時(shí),你的訂單的action要查詢此用戶的地址,如果地址為空則設(shè)置一個(gè)值,如hasAddress=0。跳轉(zhuǎn)到前端頁(yè)面后,加載js,判斷hasAddress=0則彈出填寫(xiě)收獲地址的彈窗,否則就不現(xiàn)實(shí)彈窗,直接顯示默認(rèn)收貨地址。

瘋子范 回答
create unique index uk_abc on tt(a,b,c);
INSERT INTO tt (a,b,c) VALUES (1,2,3) 
  ON DUPLICATE KEY UPDATE c=c+values(c);
北城荒 回答

不推薦存數(shù)據(jù)庫(kù)中,假如站點(diǎn)訪問(wèn)量大的時(shí)候,對(duì)數(shù)據(jù)庫(kù)會(huì)頻繁寫(xiě)入,頻繁讀取,從而影響數(shù)據(jù)庫(kù)性能。一般用redis memcache存更好些。而且維護(hù)過(guò)期時(shí)間等也方便。設(shè)置key過(guò)期時(shí)間就好。

亮瞎她 回答

每個(gè)docker容器都有自己的ip,一般docker的ip是以172.17.0.x這樣的形式分配的。
你的宿主機(jī)也是有ip地址的。你在docker里面寫(xiě)127.0.0.1是有問(wèn)題的,那只會(huì)指向你自己的docker本機(jī)。
正確的做法是,寫(xiě)成宿主機(jī)的ip地址就可以了。

歡迎加Q群交流討論Java技術(shù):696883318

尐懶貓 回答

應(yīng)該是表名不支持使用占位符替換,占位符只能用來(lái)代替要插入的值