On 12/12/15, Cecil Westerhof <cldwesterhof at gmail.com> wrote:
> I am playing with SQLite. I am thinking about writing an application for
> projects. At the moment I have the following:
>
> CREATE TABLE `projects` (
>     `projectID`     TEXT    PRIMARY KEY,
>     `groupID`       TEXT,
>     `isPersonal`    INTEGER NOT NULL CHECK(isPersonal in (0, 1)),
>     `name`          TEXT,
>     `description`   TEXT,
>     `outcome`       TEXT
> );
> CREATE INDEX projects_groupID_idx
> ON projects(groupID);
> CREATE INDEX projects_isPersonal_idx
> ON projects(isPersonal);
>
> ?I like to differentiate between personal and non personal projects. Is it
> a good idea to put a index on isPersonal?

No, usually not.  An exception would be if the boolean is almost
always true or almost always false.  Then using a partial index on
(the infrequent value of) that boolean might make sense.

   CREATE TABLE t1(
      id INTEGER PRIMARY KEY,
      isPersonal BOOLEAN -- usually false
   );
   CREATE INDEX t1x ON t1(isPersonal) WHERE isPersonal;

Then queries of the form:

   SELECT * FROM t1 WHERE isPersonal;

Would use the index, but the index will not take up much space.

>
>
> By the way: I am thinking about using UUID for projectID and groupID, but I
> heard somewhere that it was a bad idea to use UUID for an indexed field. Is
> this true??
>

I think you might have misunderstood.  UUID is almost always a good
field to index.

One other point:  The use of grave accents to quote column names is a
mysql-ism.  SQLite also supports that for compatibility.  But you
still shouldn't do it.  The proper SQL-standard way is double-quote.
-- 
D. Richard Hipp
drh at sqlite.org

Reply via email to