产品数据库结构:如何存储每个产品的选项列表?

时间:2012-06-02 02:48:41

标签: php mysql

我正在寻找一些关于产品数据库设计的方向以及存储/检索数据的最佳方法的建议。我正在讨论的块是如何最好地代表产品可能具有的各种(有效)选项。

基本结构是(不是实际的表定义):

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

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

BODYOPTIONS_TABLE {
ID,
BODYNAME,
etc...
}

在AVAILABLEOPTIONS字段中存储值的最佳方法是什么,这将允许我指定OPTIONS表以及产品可用的那些表中的ID。(即产品可能不适用于所有产品特定选项表中的选项)

我做了很多研究(主要是在这个伟大的网站上)并查看了JSON,序列化值,多维数组等,但我不确定最好的方法。

最后,AVAILABLEOPTIONS值将用于显示产品页面上的选项或用于构建表单以供用户生成有效的产品代码。我还将尝试设置一个输入表单,允许管理员为数据库中的存储生成可用选项值。

非常感谢任何提示或想法!


我不确定这是否是放置此更新的正确位置,但这里有。

做了更多的研究,似乎在一个领域中存储多个值是一个明确的禁忌。我不确定EAV模型是否适合我的需要。但是当我对数据库要求进行规范化时,我不确定我是否已经弄明白了。我想出了这个:

图片在这里:http://dev.aqualux.com.au/images/1.png (不允许我在编辑中发布图像,因为我在这里太新了......)

橙色表中的pid / oid是外键。我不理解的问题是,任何给定的产品都可以有给定类型的多个选项,或者根本没有......

由于

2 个答案:

答案 0 :(得分:2)

你有没有想过创建一个像桥梁一样的附加表?最近,我构建了一个数据库,用于在Adobe MSSQL中存储Adobe Captivate结果。其中一个要求是根据员工及其部门创建一个独特的学生。仅此一项就是三个表格,我将桥梁用作个人评估的标识符。

我在下面的博客中发布了一些代码段。请注意,这是直接从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
);

修改您的PRODUCT表,使您的AVAILABLEOPTIONS为SMALLINT和外键,类似于https://stackoverflow.com/a/1545264

答案 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