2012-06-02 137 views
1

我正在尋找一些建議,以瞭解產品數據庫的設計以及從中存儲/檢索數據的最佳方法。我打的塊是關於如何最好地表示產品可能具有的各種(有效)選項。產品數據庫結構:如何存儲每種產品的選項列表?

的基本結構是(不是實際的表定義):

PRODUCT_TABLE { 
ID(int), 
NAME(varchar), 
AVAILABLEOPTIONS(varchar), 
etc... 
} 

COLOROPTIONS_TABLE { 
ID(int), 
COLORNAME(varchare), 
etc... 
} 

BODYOPTIONS_TABLE { 
ID, 
BODYNAME, 
etc... 
} 

什麼是存儲在AVAILABLEOPTIONS字段中的值,讓我到指定範圍內的那些選項表和ID的最佳方式(即產品可能不適用於特定選項表中的所有選項)

我已經完成了一大堆研究(主要是在這個偉大的網站上),並觀察了JSON,串行化值,多維數組等,但我不確定最好的方法。

最後,AVAILABLEOPTIONS值將用於顯示產品頁面上的選項或用於構造表單以供用戶生成有效的產品代碼。我也會嘗試設置一個輸入表單,允許管理員爲數據庫中的存儲生成可用選項值。

任何提示或想法將不勝感激!


我不知道這是否是把這個更新正確的地方,但在這裏不用。

已經做了更多的研究,似乎多個值在單個字段中的存儲是一個明確的禁忌。我不確定EAV模型是否適合我的需求。但是,當涉及到規範我的數據庫要求時,我不確定我是否知道了。我想出了這一點:

的形象在這裏:http://dev.aqualux.com.au/images/1.png (不會讓我張貼圖片的編輯,因爲我太新來的...)

其中PID/OID在橙色表是外鍵。我沒有把握的問題是,任何給定的產品能有一個給定類型的多個選項,或者根本就沒有....

感謝

+1

不要。不要將列表存儲在單個列中。做一些關於「規範化」的研究,並學習如何正確構建表格。你可以從這本[維基百科文章]開始(http://en.wikipedia.org/wiki/Database_normalization)。將列表存儲在單個列中使得在查詢(或幾乎任何其他用戶界面)中使用它非常困難。您也不會存儲對錶的引用;你通過ID在表上加入;如果您有多個選項,則應該在中間表中有多行,每個選項一個,並在該表中加入其他表。再次,研究。 :-) –

+0

@KenWhite是絕對正確的。如果您將可用選項作爲列表存儲,這意味着您將永遠無法使用簡單的數據庫查詢來獲取數據 - 一切都將是查詢,將結果拉入PHP並解碼列表。這意味着一個簡單的問題,如「哪些產品藍色」最終將需要幾個單獨的查詢。可能會改爲創建一個AVAILABLEOPTIONS表,其中每個條目代表一個選項(因此該行的數據將包含產品ID,選項類型和選項ID),該表可以包含多個給定產品的條目。 – octern

+0

謝謝肯。有很多人在尋找這樣做的方式,但我收集它並不是最好的方法。將繼續研究! – nickc

回答

2

你有沒有想過再創建一個表像的橋樑?最近,我構建了一個數據庫來將Adobe Captivate結果存儲在MSSQL中。其中一項要求是根據員工及其部門創建一個獨特的學生。僅此而已,就是三張桌子,我用橋牌作爲個人評估的標識符。

我已經從我的博客下面張貼片段。請注意,這是直接從MSSQL中提取的。

CREATE TABLE [dbo].[division](
    [id] [INT] IDENTITY(1,1) NOT NULL, 
    [divisionName] [VARCHAR](50) 

CREATE TABLE [dbo].[employee](
    [id] [INT] IDENTITY(1,1) NOT NULL, 
    [personName] [VARCHAR](50) 

CREATE TABLE [dbo].[student](
    [id] [INT] IDENTITY(1,1) NOT NULL, 
    [employee_id] [INT] NOT NULL, 
    [division_id] [INT] NOT NULL 

CREATE TABLE [dbo].[core](
    [id] [INT] IDENTITY(1,1) NOT NULL, 
    [assessment_id] [INT] NOT NULL, 
    [status_id] [INT] NOT NULL, 
    [rawScore] [INT] NOT NULL, 
    [maxScore] [INT] NOT NULL, 
    [minScore] [INT] NOT NULL, 
    [accuracy] [INT] NOT NULL, 
    [TIME] [datetime] NOT NULL, 
    [student_id] [INT] NOT NULL, /****** My unique record ******/ 
    [DATE] [datetime] NOT NULL 

所以你的情況,你將有一個選項表

CREATE TABLE options(
    id INT AUTO_INCREMENT PRIMARY KEY, 
    color SMALLINT, 
    body SMALLINT 
); 

和修改產品表,使您的AVAILABLEOPTIONS是SMALLINT和外鍵,同樣喜歡https://stackoverflow.com/a/1545264

+1

要求人們訪問您的博客閱讀您的答案的詳細信息不是一個答案。如果您的博客網站已關閉,您的帖子將變得毫無意義,而且內容無法搜索。如果你想發佈一個鏈接到非現場博客文章,請將其作爲對原始問題的評論;如果您想將其用作答案,請將所有相關信息放在此處,並將該鏈接作爲關於該信息的詳細討論的附加參考。 –

+0

謝謝@Ken,好點。固定。 – Ian

+0

幹得不錯。 +1,伊恩。 :-) –

1

如果我讀正確,你讓比它更難。

您的產品存儲在產品表

PRODUCT_TABLE { 
    ID(int), 
    NAME(varchar), 
    etc... 
} 

然後在引用該id在選項表。我會找出一種方法來創建一個選項表。以下示例使用magento使用的EAV model

OPTIONS_TABLE { 
    PRODUCT_ID(int), 
    ATTRIBUTE(varchar), // colorname, or bodyname 
    VALUE(varchar) // value 
} 

爲了得到一個產品和它的選項,你做一個簡單的加入

select 
    product_table.id,...options_table.attribute, options_table.value 
where 
    product_table.id=<ID> and options_table.product_id = options_table.id 
+0

嗨蓋倫,謝謝你,我認爲你是對的,我可能一直在做它比它更難。現在用你建議的方法做一個小規模的測試,看看它是如何發展的。 – nickc

相關問題