簡體   English   中英

mysql中逗號分隔字段的更好替代方案

[英]Better alternative for comma separated field in mysql

在我的應用程序中,每當用戶上傳壁紙時,我需要將該壁紙裁剪成3種不同的尺寸並將所有這些路徑(裁剪圖像的3條路徑和原始上傳壁紙的1條路徑)存儲到我的數據庫中。
我還需要存儲原始壁紙(由用戶上傳的一個)的tinyurl。

在解決上述問題的同時,我提出了以下表格結構。

CREATE TABLE `wallpapermaster` (
  `wallpaperid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` bigint(20) NOT NULL,
  `wallpaperloc` varchar(100) NOT NULL,
  `wallpapertitle` varchar(50) NOT NULL,
  `wallpaperstatus` tinyint(4) DEFAULT '0' COMMENT '0-Waiting,1-approved,2-disapproved',
  `tinyurl` varchar(40) NOT NULL
) ENGINE=MyISAM

wallpaperloc是一個逗號分隔字段,由原始壁紙位置和所有裁剪實例的位置組成。

我知道在關系數據庫的世界中使用逗號分隔的字段被認為是一個糟糕的設計,所以你想建議一些其他整潔有效的方法嗎?

在wallpapermaster和位置表之間使用1:n關系。

像這樣的東西:

CREATE TABLE wallpapermaster (
  wallpaperid     int unsigned NOT NULL AUTO_INCREMENT,
  userid          bigint NOT NULL,
  wallpaperloc    varchar(100) NOT NULL,
  wallpapertitle  varchar(50) NOT NULL,
  wallpaperstatus tinyint DEFAULT '0' COMMENT '0-Waiting,1-approved,2-disapproved',
  primary key (wallpaperid)
) ENGINE=InnoDB;


CREATE TABLE wallpaperlocation (
  wallpaperid  int unsigned NOT NULL,
  location     varchar(100) NOT NULL,
  tinyurl      varchar(40),
  constraint fk_loc_wp 
      foreign key (wallpaperid) 
      references wallpapermaster (wallpaperid),
   primary key (wallpaperid, location)
) ENGINE=InnoDB;

wallpaperlocation的主鍵確保無法插入相同的位置兩次。

請注意, int(10)不定義任何數據類型約束。 它僅僅是客戶端應用程序的提示 ,指示該數字具有多少位數。

通常你使用固定的位置(可能在配置之外),修復擴展名(通常是jpg )和特殊的文件名格式,如[name]-1024x768.jpg 這樣你只需要這個名字

在我看來使用; 或者,即使在關系數據庫中, siple應用程序也是非常好的解決方案。

你應該考慮一下分裂圖像的數量。 如果將有少於5個壁紙我不會采取架空復雜的解決方案。

  • 它很容易在數據庫和應用程序中維護。 您將使用字符串splitting/joining方法
  • 無需添加額外的其他表 ,您將使用join到retreive值。
  • 使用簡單的varchar而不是xml更好,因為您不必依賴應用程序數據庫訪問引擎。 使用ORMJDBC時 ,還需要額外的工作來處理更復雜的數據類型。

在更復雜的系統中,我會創建XML列。

雖然縮略圖是從單個上傳文件自動生成的,但您根本不需要將路徑存儲到裁剪/調整大小的文件。

相反,你可以只使用規范化的文件名來縮略圖,然后在文件系統中找到它們 - 這是KingCrunch建議的: photo1.jpgphoto1-medium.jpg等。

無論如何,我的2cc:為了避免使用一些收割機遍歷您的圖像庫(並創建縮略圖),最好加上每個縮略圖的名稱,即使只是MD5 +一些秘密密鑰,所以只有知道密鑰的程序才能創建正確的密鑰。基於原始名稱/路徑的縮略圖路徑。 對於其他客戶端,命名序列將是隨機的。

CREATE TABLE `wallpapermaster` (
  `wallpaperid` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `userid` bigint(20) NOT NULL,
  `wallpapertitle` varchar(50) NOT NULL,
  `wallpaperstatus` tinyint(4) DEFAULT '0' COMMENT '0-Waiting,1-approved,2-disapproved',
  `tinyurl` varchar(40) NOT NULL
) ENGINE=MyISAM

創建一個新表,它將與“wallpapermaster”表創建關系

create wallpapermaster_mapper( 
    `id` unsigned NOT NULL AUTO_INCREMENT,
    `wallpapermaster_id` int(10) //this will be foreign key with id of wallpapermaster table
    `wallpaper_path1`  varchar(100) NOT NULL,
    `wallpaper_path2`  varchar(100) NOT NULL,
    `wallpaper_path3`  varchar(100) NOT NULL,
    )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM