数据库表设计用于某些未知数据

时间:2011-02-21 16:30:26

标签: php mysql database database-design codeigniter

因此,我没有来自数据库设计背景,我的任务是设计一个最终用户将输入产品的Web应用程序,以及他们产品的规格。通常我认为我只会为他们将要输入的每种规格类型创建行。相反,他们有各种不同的规格类型的产品,所以我的问题是,组织这些数据的最有效和面向未来的方法是什么?我倾向于将序列化对象推入通用“数据”行,但是你能够对这些数据进行全文搜索吗?还有其他途径可供探索吗?

4 个答案:

答案 0 :(得分:2)

将产品和规格分成两个表格,如下所示:

products
id name

specifications
id name value product_id

在您知道产品ID时获取产品的所有规格:

SELECT  name,
        value
FROM    specifications
WHERE   product_id = ?;

当您知道产品ID,规格名称和所述规格的值时,为产品添加规范:

INSERT INTO specifications(
    name,
    value,
    product_id
) VALUES(
    ?,
    ?,
    ?
);

因此,在您向产品添加规格之前,必须存在此产品。此外,您不能重复使用多个产品的规格。这需要一个更复杂的解决方案:)即......

这次有三张桌子:

products
id name

specifications
id name value

products_specifications
product_id specification_id

在您知道产品ID时获取产品的所有规格:

SELECT  specifications.name,
        specifications.value
FROM    specifications
JOIN    products_specifications
ON      products_specifications.specification_id = specifications.id
WHERE   products_specifications.product_id = ?;

现在,添加规范变得有点棘手,因为您必须检查该规范是否已存在。所以这比第一种方式重一点,因为db上有更多的查询,并且应用程序中有更多的逻辑。

首先,找到规范的id:

SELECT  id
FROM    specifications
WHERE   name = ?
AND     value = ?;

如果没有返回id,这意味着所述规范不存在,因此必须创建:

INSERT INTO specifications(
    name,
    value
) VALUES(
    ?,
    ?
);

接下来,要么使用select查询中的id,要么获取最后一个插入ID以查找新创建的规范的id。将该ID与获得新规范的产品的ID一起使用,并将两者连接在一起:

INSERT INTO products_specifications(
    product_id,
    specification_id
) VALUES(
    ?,
    ?
);

但是,这意味着您必须为每个特定规范创建一行。例如如果你有鞋子的尺码,每个已知的鞋子尺码都会有一排

specifications
id name value
1  size 7
2  size 7½
3  size 8

等等。我认为这应该足够了。

答案 1 :(得分:0)

您可以查看使用EAV model

答案 2 :(得分:0)

我从未构建过产品数据库,但我可以为您指出数据模型。它是200多种可供选择的模型之一,在Database Answers上。 Here is the model

如果你不喜欢这个,你可以找到15种面向产品的数据库的不同数据模型。单击“数据模型”以获取列表并向下滚动到“产品”。

你应该在那里找到一些好的设计理念。

答案 3 :(得分:0)

这是一个非常常见的问题 - 针对不同的场景有不同的解决方案。

如果在开发时修复并了解不同类型的产品及其属性,您可以查看Craig Larman的书中的描述(http://www.amazon.com/Applying-UML-Patterns-Introduction-Object -Oriented / dp / 0131489062 / ref = sr_1_1 / 002-2801511-2159202?ie = UTF8& s = books& qid = 1194351090& sr = 1-1) - 有一个关于对象关系映射以及如何处理继承的部分。 这归结为“将所有可能的列放入一个表”,“为每个子类创建一个表”或“将所有基类项放入公共表中,并将子类数据放入它们自己的表中”。

这是迄今为止使用关系数据库最自然的方式 - 它允许您创建报告,使用现成的工具进行对象关系映射,如果这需要您的想象,并且您可以使用标准概念,如“not null”,索引等。

当然,如果您在开发时不知道数据属性,则必须创建灵活的数据库模式。

我见过3种一般方法。

第一个是davogotland描述的那个。我为电子商务商店建立了类似线路的解决方案;它工作得很好,并使我们对产品数据库非常灵活。即使有50万种产品,它也表现得非常好。 主要缺点是创建检索查询 - 例如“找到价格低于x的所有产品,在y类中,其制造商为z”。引入新开发人员也很棘手 - 他们的学习曲线相当陡峭。 它还迫使我们将许多关系概念推入应用层。例如,很难为其他表(例如“制造商”)创建外键并使用标准SQL功能强制执行它们。

我见过的第二种方法是你提到的方法 - 以某种序列化格式存储变量数据。这在查询时很痛苦,并且与关系模型有相同的缺点。总的来说,我只想对您不必查询或推理的数据使用序列化。

我看到的最终解决方案是接受新产品类型的添加总是需要一定程度的开发工作 - 如果没有别的话,你必须构建UI。我已经看到了在创建新产品类型时使用脚手架样式方法自动生成底层数据库结构的应用程序。 这是一项相当重要的工作 - 仅适用于大型项目,尽管使用ORM工具通常会有所帮助。