This commit is contained in:
Maurice Parker 2019-04-29 05:52:03 -05:00
commit 96054b1b4e
2 changed files with 40 additions and 1 deletions

View File

@ -0,0 +1,37 @@
# Why Articles and Statuses Are Separate Tables
An `Article` is an immutable struct; an `ArticleStatus` is a mutable object.
In the database (see ArticlesDatabase), theyre stored in two separate tables: `articles` and `statuses`.
The articles table contains the columns youd expect: `articleID`, `title`, `contentHTML`, and so on.
The statuses table contains `articleID`, `read`, `starred`, `userDeleted`, and `dateArrived` columns.
This separation is deliberate. There are two main reasons: syncing, and strange behavior.
## Syncing
When syncing with another service, its entirely likely that the service will report article status information in calls that are separate from calls to retrieve articles.
Thus the app might learn about statuses for articles it hasnt seen yet.
This way the app can store those statuses without having to have their corresponding articles. And then, when the app does download those articles, it has their statuses already in the database.
## Strange Behavior
The articles database periodically deletes old articles that have been read. (In theory. This code has still to be written at this date (28 April 2019).)
However, it retains old statuses for a considerably longer period of time.
The reason for this is the following strange behavior:
* An article with no pubDate appears in a feed.
* Many months pass, and the article is deleted from the database.
* That exact article re-appears in the feed.
With the article deleted — and since it has no pubDate — how can the app tell if this is a new or old article?
Heres how: it still has the status, and the status includes a `dateArrived` property which is in the distant past — and so NetNewsWire knows that its not new but old.
Note that statuses do get deleted eventually, too (in theory) — but thats after a much longer period of time.

View File

@ -2,4 +2,6 @@
This document will collect notes relevant to syncing. This document will collect notes relevant to syncing.
[Account Structure](Accounts.markdown) [Account Structure](Accounts.markdown)
[Why Articles and Statuses Are Separate Tables](ArticlesAndStatuses.markdown)