检索此数据的最佳方法是什么?

时间:2010-03-02 03:27:31

标签: asp.net mysql stored-procedures information-architecture

此方案的体系结构如下:

我有一个项目表和几个表格表。这些项目不是让表单拥有项目,而是拥有表单。这是因为一个项目可以是多种形式(尽管每种类型只有一种,但不一定是任何一种)。表格和项目都由共同OrderId绑定在一起。这可以表示如下:

OrderItems | Form A   | Form B etc....
---------- |--------- |
ItemId     |FormAId   |
OrderId    |OrderId   |
FormAId    |SomeField |
FormBId    |OtherVar  |
FormCId    |etc...

这适用于这些表单。但是,还有另一种形式(例如,FormX),它不能有OrderId,因为它包含来自多个订单的项目。 OrderItems确实包含FormXId的列,但我对获取与单个OrderId相关的“FormX”列表的最佳方法感到困惑。我正在使用MySQL,并且认为可能存储过程是最好的方法,但我从来没有在MySQL上使用存储过程而且真的不知道最好的方法。我的另一个(kludgy)选项是两次点击数据库,首先获取给定OrderId的所有项目FormXId,然后获取所有FormXId个并执行动态SELECT语句,我在其中执行类似(伪代码)

的操作
SELECT whatever FROM sometable WHERE FormXId=x OR FormXId=y....

显然这不太理想,但我无法想到任何其他方式......我能以编程方式或架构方式做得更好吗?我的后端代码是ASP.NET。

非常感谢!

更新

响应更多信息的请求:

示例输入:

OrderId = 1000

示例输出

FormXs:
-----------------
FormXId | FieldA | FieldB | etc
-------------------------------
1003    | value  | value  | ...
1020    | ... .. ..
1234    | .. . .. . . ... 

您看到的问题是FormX没有一个OrderId,而是OrderId的集合。有时,同一订单中的多个项目在FormX上,有时它只是一个,大多数订单在FormX上没有任何项目。但是当有人提起他们的订单时,我需要他们所有的FormXs出现,以便他们可以修改/查看。

我在考虑创建一个存储过程来执行我上面所说的操作,运行一个查询来下拉所有相关的OrderId,然后另一个查询返回相应的FormX。但必须有更好的方法......

1 个答案:

答案 0 :(得分:1)

我知道您需要获取与单个OrderId相关的“FormX”列表。你说,OrderItems确实包含FormXId的列。 您可以发出以下查询:

select 
    FormX.*
From 
    OrderItems
join
    Formx
on
    OrderItems.FormXId = FormX.FormXId
where
    OrderItems.OrderId = @orderId

您需要将@orderId传递给您的查询,您将获得一个包含与此订单相关的FormX记录的记录集。

您可以使用@orderId参数将此查询打包为存储过程,也可以使用动态sql并将@orderId替换为执行查询的实际订单号。