簡體   English   中英

從mysql表中的php存儲類別名稱的最佳方法

[英]Best way to store a category name from php in a mysql table

我的項目是使用php和js編寫的使用mysql數據庫的網站。

我需要存儲一個帶有“類別”或“類型”的項目(找不到更好的名稱)。 每個項目只能有一個類別。

每個類別都有一個由php和javascript代碼使用的“名稱”(一種ID),例如“ hat”。

這些“名稱”硬編碼在php / javascript代碼中。 它們不是用戶定義的。 有一個已知的清單。 應用程序的新版本中可能會有新的“名稱”,最終可以刪除其中一些。

這是我考慮的解決方案:

具有一對多關系的第二張桌子

這是我目前正在使用的解決方案。

該數據庫將如下所示:

項目

  • INT ID(主要)
  • INT category_id(索引)

分類

  • INT ID(主要)
  • VARCHAR名稱(唯一)

缺點(對我而言):

  • 我必須將類別存儲在數據庫中。 目前,我有種選擇,可以將所有類別添加到數據庫中。 但是這樣一來,數據至少存在兩個位置(DRY!),並且每次修改時我都必須更新種子腳本。
  • 當我執行查詢時,我必須使用兩個表,因為php代碼僅知道“名稱”
  • 當我插入記錄時,我必須先執行一個子請求才能從“名稱”中找到類別ID

MySQL枚舉

該數據庫將如下所示:

項目

  • INT ID(主要)
  • 枚舉類別(索引)[帽子,襯衫,襪子...]

它具有刪除第一個解決方案的兩表查詢的優點,但是數據仍然是重復的,並且比以往任何時候都更難以對數據庫進行存儲。

項目表中的字符串字段

該數據庫將如下所示:

項目

  • INT ID(主要)
  • VARCHAR類別(索引)

類別名稱和索引直接存儲在“項目”表中。 從查詢角度來看,我的印象是索引的行為與我先前使用的第二個表相同(具有僅查詢一個表和一個索引而不是兩個表和兩個索引的優點)

所以,問題...

就性能和/或可維護性而言,最佳方法是什么? 還有另一種更好的方法嗎?

具有完整性約束會很好,但不是必須的。 (我可以通過其他方式解決此問題)

我發現了以下線程: php mysql-我是否應該將“類別名稱”字段添加到表中? ,但關系是多對多的,看起來像是類別的可變列表。 因此,這實際上不適用於我的情況。

這取決於,

您將擁有幾個類別,需要多久更新一次?

在添加Enum之前,我已經采用了這種方法,但是還在類中編寫了一個靜態方法並在其中存儲了有效名稱。

class Item{


    public static function get_categories()
    {

        // only works in php >=5.4 otherwise use return array('Category1'...);
        return [
          'Category1' => 'Category1',
          'Category2' => 'Category2',
          'Category3' => 'Category3'
        ];
    }

}

執行以上操作,您可以通過Item :: get_categories()輕松訪問數組,該數組應對應於數據庫中ENUM字段中的值。 如果需要添加更多類別,請將其添加到數據庫,然后添加到此功能。 您可以使用它來驗證用戶的選擇並生成javascript選項。

然而!!!!

您提到填充表的種子,這將無法輕松地為您更新ENUM。

我會使用一個ENUM,因為

1)。 易於設置2)。 這比將兩個表聯接起來要容易一些(但JOINS是學習中的王牌)3)。 如果您使用了輔助表,您(如您指出的那樣)必須先從該表中查找值,然后插入,或者如果下拉列表中使用了類別,則使用類別ID及其名稱來填充下拉列表(我會這樣)

最后的想法

除非您的站點非常繁忙,否則兩種方法(查找表和ENUM)的性能都可能會引起大麥的注意。 您仍然必須同時使用兩種版本來更新類別表,但是使用INSERT語句代替ALTER TABLE會稍微容易一些

無論您選擇哪種方式,如果您不喜歡它,更新代碼都將非常容易。

希望這會有所幫助,並祝你好運

記住保持簡單愚蠢的吻

暫無
暫無

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

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