我正在为Android编写我的第一个应用程序,它将使用SQLite数据库,因此将尝试尽可能限制大小,但是我认为这个问题通常适用于数据库设计。
我打算存储将包含文本和创建日期的记录。该应用程序是一个独立的应用程序,即它不会链接到互联网,只有一个用户将对其进行更新,因此,在给定的日期,将不会有多个条目。
我的表格还需要一个ID列吗?如果是这样,使用ID作为记录标识符而不是日期有什么好处?
我正在为Android编写我的第一个应用程序,它将使用SQLite数据库,因此将尝试尽可能限制大小,但是我认为这个问题通常适用于数据库设计。
我打算存储将包含文本和创建日期的记录。该应用程序是一个独立的应用程序,即它不会链接到互联网,只有一个用户将对其进行更新,因此,在给定的日期,将不会有多个条目。
我的表格还需要一个ID列吗?如果是这样,使用ID作为记录标识符而不是日期有什么好处?
Answers:
恕我直言,最好避免使用日期列作为主键。
我曾在将日期字段用作主键的系统上工作,如果要使用日期字段,编写查询以拉回数据的子集会有些麻烦。
您可能需要考虑的其他几点:
您可能会认为某个时间点是唯一的,但这取决于日期列的粒度。是分钟,秒,毫秒等。您是否可以绝对确定永远不会遇到主键冲突?
最后,如果您希望将数据库迁移到另一个平台,则在两个平台之间日期数据的粒度不同时,您可能会再次遇到问题。
当然,您确实必须在理想与工作目标之间取得平衡。如果真的很需要空间,那么使用date列可能会减少两种危害。那是您必须做出的设计决定。
编辑:
我应该指出,这绝不表示这是一个糟糕的设计决策。只是RDBMS的实用性可能存在问题。
不,如果您可以保证永远不会有重复的日期,则不必严格要求在架构中定义ID列。
但是 ...
...也就是说,您还是应该使用它。这里的小秘密是,SQLite已经为每个称为ROWID的表提供了唯一的,自动递增的ID。如果您在表格中将自动递增的整数列声明为PK,则SQLite不会创建新列-它将简单地为该预先存在的ROWID列添加别名。
在SQLite中,每个表的每一行都有一个64位带符号整数ROWID。在同一表的所有行中,每一行的ROWID是唯一的。
您可以使用特殊列名称ROWID,ROWID或OID 之一访问SQLite表的ROWID。除非您声明普通表列使用那些特殊名称之一,否则使用该名称将引用声明的列而不是内部ROWID。
如果表包含INTEGER PRIMARY KEY类型的列,则该列将成为ROWID的别名。然后,您可以使用以下四个不同的名称中的任何一个来访问ROWID:上述三个原始名称或为INTEGER PRIMARY KEY列指定的名称。所有这些名称都是彼此的别名,并且在任何情况下都可以很好地工作。
http://www.sqlite.org/autoinc.html
因此,不使用ID列就不会节省任何空间,因为无论您想要与否,每个表都会得到一个!
如果满足以下任一条件,请使用ID字段:
阅读以下问题:是否有规范的资料来源支持“所有替代品”?
编辑:
依我看来,以上似乎都不成立,因此您不需要使用和ID字段,但是您可以根据需要使用一个。