如何设置自定义数据库密钥?

时间:2012-10-05 21:00:37

标签: database sqlite

我正在设计一个数据库结构(Android上的SQLite),它将包含两个表:Containers(表1)和Object / Container Data(表2)。

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

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

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

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

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

我从http://www.sqlite.org/autoinc.html那里得到了(希望我能在两天前看到它:))现在我必须去,所以如果有机会的话我会发回信息。

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

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

1 个答案:

答案 0 :(得分:2)

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

这称为每类型表层次(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