2012-12-10 78 views
0

我對我的數據庫模型的概念有些麻煩。MySQL數據庫CSV文件和構想

我有一個很大的CSV文件的未來網站的類別。

BIGCAT1;SUBCAT1;SUBSUBCAT1;BRAND1 
BIGCAT1;SUBCAT1;SUBSUBCAT2;BRAND2 
BIGCAT2;SUBCAT2;SUBSUBCAT3;BRAND1 
BIGCAT2;SUBCAT2;SUBSUBCAT4;BRAND3 

正如您所見,SUBCATx只屬於BIGCATx。一個SUBSUBCATx只屬於一個SUBCATx。但BRANDx可以屬於多個SUBSUBCAT。

在開始時,我創建了一個CSV解析器......並且我將每個品牌的counsider像subsubsub ... cat一樣。它有效,但它是如此令人反感。如果我把每個品牌都當作一個品類來對待,我就有3600個品牌...當我刪除重複品時,我只有2106個獨特的品牌......(+/- 1,500個副本)。

如果我認爲我的關係類別(id,is_active)/ category_has_brand(category.id,brand.id)/ brand(id,is_active)的數據庫模型:我如何使用CSV文件來生成我的數據庫插入?

因爲它很有趣...它是多語言的(對於BIGCAT,SUBCAT,SUBSUBCAT而不是BRAND)。

如果我手工填寫這個數據庫......沒關係。但我不想這樣做。

有人有想法嗎?我使用PHP和MySQL來讀取我的文件並填充我的數據庫。

有沒有辦法使用這種CSV來生成3個SQL表中的條目:category(id,is_active)/ category_has_brand(category.id,brand.id)/ brand(id,is_active)?

Regards

+0

如果你問一個具體問題,或至少定義了一個「想法」的準則,這將有助於您可能會收到。 –

+0

爲什麼你的字段用分號而不是逗號分隔? –

+0

它只是一個分隔符。這並不重要。唯一的問題是「有沒有辦法使用這種CSV來生成3個SQL表中的條目:類別(id,is_active)/ category_has_brand(category.id,brand.id)/品牌(id,is_active)? –

回答

1

我覺得你問兩個問題:

  • 我應該如何架構我的數據庫?
  • 我應該如何導入我的CSV文件?

數據庫設計可以很簡單:

Category 
----------- 
CategoryID 
ParentCategoryID 

這是基於「子類別只屬於一個父」的聲明。如果結果是「多對多」,則需要創建一個連接表而不是ParentGategoryID。

要存儲本地化的類別描述等,你可以有一個本地化的字符串表:

CategoryDescription 
------------ 
CategoryID 
Locale 
Description 

從你寫的東西,有一個「多對多」品類和品牌之間,因此,將工作如下:

Brand 
----- 
BrandID 
.... 

CategoryBrand 
--------- 
CategoryID 
BrandID 

我不認爲有一個很好的導入CSV文件的方式。僞代碼可能是:

for each line in CSV file 
    for each field in line 
    if field is category 
      add category if not exists 
      if category is not top level 
       set category Parent to last category 
      end if 
    end if 
    if field is brand 
     add brand if not exists 
     set brand category to last category 
    end if 
    next field 
next line 
0

我會爲Cat/Subcat/SubSubcat創建3個表格。

CatId | Description | Whatever else fits there, like "active flag". 

...

SubCatId | Description | Whatever else fits there, like "active flag". 

...

SubSubCatId | Description | Whatever else fits there, like "active flag". 

那麼品牌表:

...

BrandId | Name | Description | Whatever else fits there, like "Country Iso Code". 

然後我會創建FOREIGH密鑰的「三胞胎+品牌」結構的3個表:

CatId|SubcatId|SubSubCatId|BrandId 

現在您的CSV導入變爲:

Read a record from CSV 
    Split it into Cat/Subcat/SubSubCat/Brand - these will all be descriptions, or names 
    Find if the the Category exists, if yes get ID from DB, otherwise create Category table and generate Id by sequence 
    Find SubCategory (as above) 
    ... 
    Find Brand (as above) 
    Create record with CatId+SubcatId+SubSubCatId+BrandId 

,利用適當的唯一密鑰,你也將避免重複兩在創建期間或在應用程序的生命週期的後期。