0

我的数据库模型的概念有些麻烦。

我有一个用于未来网站类别的大 CSV 文件。

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

如您所见,SUBCATx 仅属于 BIGCATx。一个 SUBSUBCATx 只属于一个 SUBCATx。但是一个 BRANDx 可以属于多个 SUBSUBCAT。

在开始时,我创建了一个 CSV 解析器...并且我将每个 BRAND 视为 subsubsub...cat。它有效,但它是如此令人反感。如果我将每个品牌视为一个类别,我有 3,600 个品牌...当我删除重复项时,我只有 2,106 个独特品牌...(+/-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)?

问候

4

2 回答 2

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
于 2012-12-10T16:31:00.610 回答
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".

然后我将创建一个“Triplet+Brand”结构,其中包含 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

使用适当的唯一键,您还可以在创建期间或应用程序生命周期的后期避免重复。

于 2012-12-10T15:10:54.693 回答