来自新手的MySQL数据库建模问题

时间:2009-03-10 01:59:45

标签: mysql database modeling

好的,我有一个问题,我搜索并搜索了在线解决方案,找不到任何线索,这里是(哦,我对这个数据库的东西很新; - )

假设我有数以千计的零售店,每个可以携带1到100种产品,但有10,000种可用的产品。我需要每个商店所有者能够看到(并编辑)他们商店中的产品列表 - 这很简单,我可以为此找出表格结构 - 但我还想做的是能够找到商店中最常见的产品组合,例如我希望看到类似的东西:

120: pid34, pid234, pid876, pid120, pid100
118: pid45, pid54, pid657, pid763, pid237
115: pid23, pid546, pid657, pid543, pid23

如果第一个数字是包含这些产品的商店数量(商店内产品的订单无关紧要),并且pid数字是产品的产品ID(除了记住最多可能有100个产品)在每个商店)。

所以如果我设置一个表:

ID, PID,    Store ID
1,  pid34,  10
2,  pid234, 10
3,  pid876, 10
4,  pid120, 10
5,  pid100, 10
6,  pid45,  45
... etc ...

我可以跟踪我的商店库存,但我不知道如何进行我的'组合'搜索,帮助!

3 个答案:

答案 0 :(得分:1)

您应该能够使用数据库查询解决大部分问题,但是您仍然需要使用另一种编程语言(例如java和JDBC)。假设您正在使用某种类型的SQL数据库。通过你的结构的外观我认为你将需要使用group by子句。虽然我不知道你的数据库结构,因为你没有提到它,所以我为了这个而说,你的表被称为“产品”

让我们首先设计一个查询来获取每个产品的数量:

SELECT pid, COUNT(*) AS NUM FROM products p GROUP BY pid ORDER BY NUM DESC;

因此,此查询将返回如下内容:

pid,    NUM
pid34   120
pid29   120
pid20   20

所以,这种情况越来越接近,但仍然不尽如人意。但是,现在通过将查询与编程语言结合使用,可以轻松完成任务。我在下面做了一些java代码作为例子。

// Assumes that database connection has already been made and is in the variable: conn1
Statement stmt1 = conn1.createStatement();
ResultSet rs1 = stmt1.executeQuery("SELECT pid, COUNT(*) AS NUM FROM products p GROUP BY pid ORDER BY NUM DESC");

int prevNum = -1;
while(rs1.next())
{
    int thisNum = rs1.getInt("NUM");
    if(thisNum != prevNum)
    {
        // this means it is a different number than the last result, start a new line
        system.out.print("\n" + thisNum + ": ");
        prevNum = thisNum;
    }
    system.out.print(rs1.getString("pid") + ", ");
}
stmt1.close();
conn1.close();

虽然我可能没有所有的逻辑正确,特别是在格式化时,这应该让你走上正确的道路,你需要如何去做。实际上,这个问题需要通过使用查询和编程语言的组合来解决。

查询可以解决一小部分问题,但是他们在解决这些问题方面做得非常好,而编程语言可以解决更多的问题。但是,在许多情况下,编程语言在解决相同问题方面不如数据库那么高效,这就是为什么将这两种方法组合在一起可以很有效地解决复杂问题。

答案 1 :(得分:0)

这绝对不是数据库问题。这是一个像Prolog或ECLiPSe这样的问题很有用的问题,或者也许是其他语言中的约束求解器。

答案 2 :(得分:0)

var1 = Select the unique store numbers

foreach var1
  select the products that apply to that store number.
/foreach

正义是正确的,这不一定是数据库问题,而是更普遍的编程问题。