2012-06-02 65 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

相关问题