Каков наилучший способ получить эти данные? - PullRequest
1 голос
/ 02 марта 2010

Архитектура для этого сценария следующая:

У меня есть таблица предметов и несколько таблиц форм. Вместо того, чтобы формы принадлежали элементам, элементы владеют формами. Это потому, что один элемент может быть в нескольких формах (хотя только один из каждого типа, но не обязательно в любой). Все формы и предметы связаны общим OrderId. Это можно представить так:

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

Это прекрасно работает для этих форм. Однако есть другая форма (скажем, FormX), которая не может иметь OrderId, поскольку она состоит из элементов из нескольких заказов. OrderItems также содержит столбец для FormXId, но я запутался в том, как лучше всего получить список "FormX", связанных с одним OrderId. Я использую MySQL и думал, что, возможно, хранимый процесс - лучший способ для этого, но я никогда не использовал хранимый процесс на MySQL и не знаю, как лучше всего это сделать. Другой вариант (kludgy) состоял в том, чтобы дважды ударить по БД, сначала получить все предметы для данного OrderId, которые также имеют FormXId, а затем получить все их FormXId и выполнить динамический SELECT утверждение, где я делаю что-то вроде (псевдокод)

SELECT whatever FROM sometable WHERE FormXId=x OR FormXId=y....

Очевидно, что это далеко не идеально, но я не могу придумать другого пути ... что-нибудь лучше, что я мог бы сделать программно или архитектурно? Мой внутренний код - ASP.NET.

Большое спасибо!

UPDATE

В ответ на запрос о дополнительной информации:

Пример ввода:

OrderId = 1000

Пример вывода

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

Вы видите, что проблема в том, что FormX не имеет ни одного OrderId, а скорее является набором OrderId s. Иногда несколько элементов из одного заказа находятся в FormX, иногда это только один, большинство заказов не имеют никаких элементов в FormX. Но когда кто-то подтягивает свой заказ, мне нужно, чтобы все FormX, к которым принадлежат его предметы, были показаны, чтобы их можно было изменить / просмотреть.

Я думал о том, чтобы, возможно, создать хранимый процесс, который будет делать то, что я сказал выше, выполнить один запрос, чтобы сбросить все связанные OrderId с, а затем другой, чтобы вернуть соответствующие FormX. Но должен быть лучший способ ...

1 Ответ

1 голос
/ 02 марта 2010

Я понимаю, что вам нужно получить список "FormX", связанных с одним OrderId. Вы говорите, что OrderItems содержит столбец для FormXId. Вы можете выполнить следующий запрос:

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

Вам нужно передать @orderId на ваш запрос, и вы получите набор записей с записями FormX, относящимися к этому заказу.

Вы можете либо упаковать этот запрос как хранимую процедуру, используя параметр @orderId, либо использовать динамический sql и заменить @orderId реальным номером заказа, для которого вы выполняете запрос.

...