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

Php 产品数据库结构:如何存储每个产品的选项列表?,php,mysql,Php,Mysql,我正在寻找一些关于产品数据库重新设计方向的建议,以及从中存储/检索数据的最佳方法。我遇到的障碍是如何最好地表示产品可能具有的各种(有效)选项 基本结构是(不是实际的表定义): 在AVAILABLEOPTIONS字段中存储值的最佳方式是什么?该字段允许我在这些表中指定产品可用的选项表和ID。(即,某个产品可能无法提供特定选项表中的所有选项) 我做了很多研究(主要是在这个伟大的网站上),研究了JSON、序列化值、多维数组等,但我不确定最好的方法 最后,AVAILABLEOPTIONS值将用于在产品页

我正在寻找一些关于产品数据库重新设计方向的建议,以及从中存储/检索数据的最佳方法。我遇到的障碍是如何最好地表示产品可能具有的各种(有效)选项

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

在AVAILABLEOPTIONS字段中存储值的最佳方式是什么?该字段允许我在这些表中指定产品可用的选项表和ID。(即,某个产品可能无法提供特定选项表中的所有选项)

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

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

任何提示或想法都将不胜感激


我不确定这是否是放置此更新的正确位置,但现在开始

我做了更多的研究,似乎在一个字段中存储多个值是绝对不可能的。我也不确定EAV模型是否适合我的需要。但是当涉及到规范化我的数据库需求时,我不确定我是否已经弄明白了。我想到了这个:

图片如下: (不允许我在编辑中发布图像,因为我在这里太新了…)

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


谢谢

如果我读对了,你让事情变得更难了

将产品存储在products表中

PRODUCT_TABLE {
    ID(int),
    NAME(varchar),
    etc...
}
然后在选项表中引用Id。不过,我会想出一个办法,有一个选项表。以下示例使用magento使用的

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
选择
产品\u table.id,…选项\u table.attribute,选项\u table.value
哪里
产品\u table.id=和选项\u table.product\u id=选项\u table.id

您是否想过创建一个额外的表来充当桥梁?最近,我建立了一个数据库,将AdobeCaptivate结果存储在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
);

并修改产品表,使可用选项为SMALLINT和外键,类似于。

不要这样做。不要将列表存储在单个列中。研究一下
规范化
,学习如何正确地构造表。你可以从这个开始。将列表存储在单个列中会使其在查询(或其他类似UI的内容)中使用变得极其困难。您也不存储对表的引用;通过ID在表上加入
JOIN
;如果有多个选项,则中间表中应该有多行,每个选项对应一行,并在该中间表上连接其他表。同样,研究。:-)@肯怀特是绝对正确的。如果将可用选项存储为列表,这意味着您将永远无法使用简单的数据库查询获取数据——一切都只需执行查询、将结果拉入PHP并解码列表即可。这意味着像“哪些产品是蓝色的”这样的简单问题最终需要几个单独的查询。相反,可以创建一个AVAILABLEOPTIONS表,该表可以包含给定产品的多个条目,每个条目表示一个选项(因此该行的数据将包括产品ID、选项类型和选项ID)。谢谢Ken。有很多人在寻找这样做的方法,但我认为这不是最好的方法。我们将继续研究!要求人们访问你的博客阅读你答案的细节并不是一个答案。如果你的博客网站关闭了,你在这里的帖子就会变得毫无意义,内容也无法搜索。如果你想发布一个非现场博客帖子的链接,作为对原始问题的评论;如果你想用它作为答案,把所有的相关信息放在这里,然后把链接作为详细讨论这些信息的额外参考。嗨,盖伦,谢谢你,我想你是对的,我可能已经让它变得更难了。现在,我们将使用您建议的方法进行一个小规模测试,并了解其进展情况。
CREATE TABLE options(
    id INT AUTO_INCREMENT PRIMARY KEY,
    color SMALLINT,
    body SMALLINT
);