首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL實現使用者書架系統後台資料結構與操作邏輯

     編輯:MySQL 綜合教學

社交閱讀平台中,「我的書架」功能需支援使用者自建書架、書籍分類管理、拖曳排序等複雜互動。本文詳細解析基於MySQL的書架系統資料庫設計與核心操作邏輯。

功能需求分析

  • 使用者可建立最多10個書架,每書架容納20本書
  • 支援書架重新命名、書籍加入/移除/位置移動
  • 「我的排序」允許拖曳自訂順序,「更新排序」按時間固定不可變更
  • 同一書架不可重複加入同一本書

資料庫設計方案

採用序列化陣列儲存於單一text欄位,結構如下:

CREATE TABLE bookshelf (
  uid INT(11),
  shelf TEXT
);

shelf欄位儲存PHP序列化後的二維陣列:Key為書架名稱,Value為20位置的字串(如0-0-5-12-0...),0表示空位,非0為書籍ID。

核心操作流程與代碼邏輯

1. 初始化預設書架

$arr = array('預設書架' => '0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0-0');
$text = serialize($arr);
INSERT INTO bookshelf (uid, shelf) VALUES ('$uid', '$text');

2. 新增書架(檢查名稱唯一性與數量上限)

$shelfs = SELECT shelf FROM bookshelf WHERE uid = '$uid';
$a = unserialize($shelfs);
foreach ($a as $key => $val) {
  if ($key == $new_shelf_name) return '書架已存在';
}
if (count($a) >= 10) return '超過最大書架數';
// 新增空書架陣列...

3. 加入書籍(檢查書架容量與重複性)

$pk = explode('-', $shelf_data);
$book_count = 0;
$has_book = false;
$empty_pos = -1;

for ($i = 0; $i < count($pk); $i++) {
  if ($pk[$i] != 0) {
    $book_count++;
    if ($pk[$i] == $book_id) $has_book = true;
  } elseif ($empty_pos == -1) $empty_pos = $i;
}
if ($has_book) return '書架已有此書';
if ($book_count >= 20) return '書架已滿';
$pk[$empty_pos] = $book_id;
UPDATE bookshelf SET shelf = '$new_serialized' WHERE uid = '$uid';

4. 移動書籍位置(拖曳排序)

$start = 2; $end = 8; // 位置索引
if ($start < 0 || $start > 20 || $end < 0 || $end > 20 || $start == $end) exit;

$temp = $array[$start];
$array[$start] = $array[$end];
$array[$end] = $temp;
UPDATE bookshelf SET shelf = '$updated' WHERE uid = '$uid';

5. 書架列表查詢(顯示書名與書籍數量)

$arr = array();
foreach ($shelves as $name => $data) {
  $count = 0;
  foreach (explode('-', $data) as $book_id) {
    if ($book_id != 0) $count++;
  }
  $arr[$name] = $count;
}

方案評析與改進建議

序列化儲存雖簡化表結構,但存在查詢效能差、無法利用索引、並發控制困難等缺點。生產環境建議採用正規化設計:

  • shelves表:id, uid, name, sort_order
  • shelf_books表:id, shelf_id, book_id, position, added_time

並透過觸發器或應用層邏輯維護位置唯一性與順序完整性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved