0

我正在设计一个数据库结构(Android 上的 SQLite),它将由两个表组成,容器(表 1)和对象/容器数据(表 2)。

表 1 将包含容器数据的键和容器/对象的键列表。表 2 将包含对象/容器的数据:标题、描述、类别、图片等。

通过这种设计,我将能够进入一个容器,获取它的数据(标题、图像)并按顺序获取其中包含的项目列表,然后搜索每个项目的数据(图像,可能是标题)。然后用户可以点击一个项目,如果它是一个对象转到它的数据,或者如果它是一个容器,重复这个过程。

如何为每个表设置 ID,以便知道 ID 属于哪个表。例如,如果 ID 为偶数,则指向表 1,如果为奇数,则指向表 2。

我想我可能刚刚找到了一个现在看起来相当明显的答案……我只需要测试一下。基本上,您可以通过在创建行时将 ID 设置为所需的内容来设置自定义 ID。

INSERT INTO test1(rowid, a, b) VALUES(123, 5, 'hello');

我是从http://www.sqlite.org/autoinc.html得到的(希望我两天前能看到它:))现在我得走了,所以当我得到一个机会。

我想我现在唯一关心的(如果它有效)是它是否会在您不使用的 ID 之间创建空行,浪费空间?

我也考虑过只有两个单独的列表,但顺序很重要,所以这需要另一个列表来跟踪对象的顺序,所以我想知道是否可以进行键操作。

4

1 回答 1

2

如果容器和对象具有公共属性,那么您可以创建一个包含公共属性的基表(项目)以及仅包含额外数据(继承)的容器和对象表。

这称为每个类型的表层次结构 (TPT)。有关 [1] 和 [2] 的更多信息。

然后,您的容器可以使用简单的外键链接到 Items,因为无论它是容器还是对象,它都会在那里有一个条目。

现在,如果您只想拥有对象,请从容器中选择所有项目并与您的对象表进行 INNER JOIN。像这样你只会得到对象而不是容器。如果您只想要容器,请使用容器表进行连接。如果您需要容器和对象并且需要所有额外数据(不在 Item 基表中),您可以对对象表执行 LEFT OUTER JOIN,然后对容器表执行 LEFT OUTER JOIN。

参考:

[1] http://www.sqlteam.com/article/implementing-table-inheritance-in-sql-server

[2] http://blogs.devart.com/dotconnect/table-per-type-vs-table-per-hierarchy-inheritance.html

于 2012-10-06T10:53:07.147 回答