我正在设计一个数据库结构(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之间创建空行,浪费空间?
我还考虑过只有两个单独的列表,但顺序很重要,所以这需要另一个列表来跟踪对象的顺序,所以我想知道是否可以进行键操作。
答案 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