2

关于在 Delphi 2009 和 MyDAC 中使用关系数据库概念,我有一个相当大的问题。

我有一个看起来像下面这样的数据库结构:


物品

  • ID
  • 姓名

贮存

  • ID
  • 姓名

存储物品

  • ID
  • item_id
  • storage_id
  • 地方

现在,当我有一个来自“项目”的活动数据集时,如何在例如 DBGrid 中显示所有关联的存储?

顺便说一句:最好不要在每个表中使用“id”,而是更改它并使用例如“id_item”或“id_storage”之类的东西?

先感谢您 :)

4

3 回答 3

2
  • 使用 StorageItem,您创建了
    多对多关系。如果您
    只需要一对多(许多存储与一个项目相关,但您
    不需要反之亦然),那么您可以将另一个字段添加到存储表 (item_id) 中,该字段将作为外键用于物品表。然后在 Storage 表中的 item_id 上创建索引,并以
    主从关系连接两个表。
  • 如果您确实需要多对多,那么您可以使用 SQL 添加一个查询组件
    (从 StorageItem 中选择 *,其中
    item_id := :current_storage_id),而 current_storage_id 是您的查询
    参数。
于 2009-05-24T16:33:30.167 回答
1

我个人对 MyDAC 并不熟悉,但大多数数据集组件都有某种方式来建立主从关系。检查您的数据集上是否有 MasterSource 属性,或以某种类似方式将详细数据集链接到主数据集。如果没有,您可以使用 TDatasetField 建立链接,并过滤嵌套数据集以仅显示正确的记录。

至于 ID 列名称,最好为每个字段指定一个描述性名称,这样您就可以通过查看代码来判断您的链接是否正确。如果您将 id 列称为“id”,那可能是任何 id 列,如果您开始传递对数据集的引用,这可能会让人感到困惑。但是,如果item_id每次都调用它(不是item_id有时和id_item有时),那么你总是知道你在看什么。它也使您更容易知道您的代码是正确的。显示“”的过滤器master.item_id = detail.item_id更容易阅读“master.id = detail.item_id”。master例如,如果分配给错误的数据集,这可能是错误的并且静默失败。

于 2009-05-24T16:30:38.170 回答
1
Select a.ID, b.Name, a.Place
from StorageItem a
inner join Storage b
on (a.id = b.id)

上面的查询将返回 StorageItem 表中的所有项目及其名称,现在如果您想过滤它以仅返回特定项目的项目添加 where 子句就像

Select a.ID, b.Name, a.Place
from StorageItem a
inner join Storage b
on (a.id = b.id)
where a.item_id = 1 -- place the item id here

您可以将 where 与参数一起使用,例如:

MyQuery.Sql.Text := ' Select a.ID, b.Name, a.Place from StorageItem a
+ ' inner join Storage b on (a.id = b.id) '
+ ' where a.item_id = :ItemNo ';
MyQuery.ParamByName('ItemNo').asInteger := 1;
MyQuery.Open;

并将上面的查询分配给 dbGrid

您也可以使用 MasterSource 属性来建立关系而不使用“where”部分

于 2009-05-24T16:41:21.403 回答