0

作为对 ZZ-bb 的回应,我会尽力澄清,尽管我认为 ZZ 已经回答了这个问题(谢谢 ZZ-bb)......

我想在数据库中表示剪贴板内容。作为用户的想法可以将项目添加到剪贴板,稍后再回来,仍然可以访问他们的剪贴板。

用户可以将图像、文件、文本块等存储到剪贴板。

这就是我的想法

  • 1 个用户到 1 个剪贴板
  • 1 个剪贴板到多个cb_items

现在问题来了。我想cb_item描述从字符、一些文本到图像 url 或文件位置的任何内容,也许是 glob,不确定。

在这个阶段,我可以只描述一个cb_item包含条目可能需要的所有可能列的表格行,或者我可以以某种方式创建一个“多态”FK ...

要做到这一点,我想。

  • 1cb_item比1type
  • 1cb_item比1typed_cb_item

然后使用类型来确定要查找的表typed_cb_item

例如

  • cb_item #1 => { IMAGE_TYPE, 1 }
  • cb_item #2 => { FILE_GLOB, 1 }

因为item #1我会typed_cb_item idcb_image_item表格中查找并获取信息,因为item #2我会typed_cb_item idcb_fileglob_item表格中查找并获取信息。

编辑- 表格可能看起来像....

cb_item_tbl
-----------
   item_id (PK)
   user_id (FK referenceing user)
   type_id
   typed_item_id >------------+ - - like "typed_cb_item" above 
                              |
cb_image_item_tbl             |
-----------------             |
   img_item_id (PK) <---------+  }
   url (string)               |  }
                              |  } OR based on type_id
cb_file_item_tbl              |  }
----------------              |  }
   file_item_id (PK) <--------+  }
   file_name       
   file_size etc etc
   maybe a glob

就软件而言,这可以正常工作,但typed_item_id不能是数据库中的真正外键,所以我不能使用数据库的引用完整性 - 必须通过 s/w 强制执行(尽管 s/w obv不应该破坏它!)并使查询更加复杂。

有没有人有什么建议?我认为这种“多态”FK 的想法可能不是最好的方法,但我喜欢我可以使用它来处理只有与该项目相关的列的项目表。

提前为任何意见或建议干杯...

4

1 回答 1

0

我不太遵循您的表格结构或最终目标,但您可以消除中间人 aka clipboard。只需制作一个或多个clipboard_item表:每种类型一个或类似类型的一个通用表。

例如,您可以有一个clipboard_item_text表:

  • id, INT AUTO_INCREMENT
  • user, INT(?), FK 到user/owner
  • item, 文本

现在,您将始终在(任何剪贴板表)item和它的owner. (如果您只是将父表的idish 值插入到子表中,就像您对任何子表一样。)

如果您需要根据 限制items每个用户的数量item type,您可以使用应用程序代码(或者可能使用数据库中的触发器)来执行此操作:items在插入新用户之前计算每个用户的数量。

每个用户clipboard现在都是一个虚拟用户:item任何表中具有相同owner值的每个用户都属于该users剪贴板。做VIEW或不做,这取决于你。

于 2013-04-10T14:20:42.480 回答