搜尋

首頁  >  問答  >  主體

java - id号应该在服务器端自增还是页面端?

论坛每个帖子都有一个id号,从1开始增长,每新增一个帖子,id增1
假设帖子有三项,id,文本和时间

在后端,设计一个类Article,类里就有三项:id, text, time

现在这个id增长有两种思路:
1) 利用数据库自增,id设为主键,启动数据库自增
2) 页面帖子前,利用ajax请求,取得数据库当前最大号maxid,然后帖子的id设为maxid+1

2)的思路在高并发的时候有问题,有可能多人同时发帖从而ajax请求获得同样的id,然后他们的帖子都是id+1

但是如果是1),那么提交帖子的时候,帖子数据只有两项,text和time
这样的话,后端可能就要设计两个类
一个Article有三项,id, text, time,另一个只ArticleWithoutID有两项 text, time
因为前端用户如果查看帖子,那么后端就要返回id, text, time三项了
但是要设计两个类,又感觉怪怪的

大家怎么看?

PHPzPHPz2888 天前414

全部回覆(3)我來回復

  • 巴扎黑

    巴扎黑2017-04-18 10:31:35

    一定是在伺服器端自增,不然可能衝突的。
    你可能會問,我都取了最大的為什麼還會衝突。如果你知道為什麼資料庫會有鎖這個概念,你就不會在這裡迷惘了。
    並發大的時候,可能是同時取得的最大ID,提交時,一個先一個後,就會導致一個提交失敗。
    另外前端資料可以偽造,身為程式設計師對前端的資料一定要持懷疑態度,要驗證

    回覆
    0
  • PHPz

    PHPz2017-04-18 10:31:35

    關係型資料庫都可以設定自增類型的欄位吧,錄入資料的時候不需要指定,資料庫自己處理自增id

    回覆
    0
  • 阿神

    阿神2017-04-18 10:31:35

    id資料庫端自增肯定是確定的,前端自增高並發肯定就玩完,毋庸置疑的。根據你的需求,一個類別完全可以搞定,沒有那麼複雜。 (id自增這個方案並不好,高並發不推薦)
    1,前端給服務端發了一個article對象,包含text和time。
    2,服務端把這個物件存入資料庫,資料庫自增生成id。資料庫端有個並發處理。
    3,存入成功後回傳整個資料或是id給前端都可以。
    4,前端接到成功的訊息,再把目前的貼文顯示在清單裡。此時已經拿到了帖子的id,可以根據id查詢。

    ====

    建議在前端產生隨機id,這樣資料庫端高並發也不會因為處理自增問題而損失效能。

    回覆
    0
  • 取消回覆