Now we already have a requirement list and use-cases of the system being built. Still using my system analyst hat, I then enter the analysis realm of domain modeling. This is an important skill that every system analyst has to master. This skill can be built by reading some materials, or gain it from experience.
Fortunately I had an experience with an existing blog engine before. It was BlogEngine.NET (BE.N), a blog engine that is built on .NET framework. It's a good blog engine that many developers have use. I was interested in extending blog engine capability to support multi lingual content. From that effort, I know a little about a blog engine object model. Some of that knowledge is applied here.
Here is the initial object model of CommunityBlog:

We define four classes: User, Blog, Page, and Post. The user is an abstraction of blog owner. It has one-to-many relation with Blog class. This indicates that a user can have many blogs. A Blog has one-to-many relation with both Post and Page classes. Post abstracts a single blog post. Page is similar to Post, except that Page abstracts static contents.
Culture class abstracts specific culture of a blog. This association is necessary since the blog owner may come from a specific culture, using specific language, and use specific currency code. PublishStatus enumeration holds the value of publishing status of Post and Page.
The diagram above focuses on the relation among classes. Other aspect that we will create in class modeling is the structural hierarchy of classes, like the one displayed below:

We define the PublishableBase as the base class for all classes we defined before. The PublishableBase captures all properties and behaviors that are common in all classes. Like for example, all classes have Title and Description properties. The PublishableBase itself is an abstract class.
Furthermore, PublishableBase inherits from EntityBase class. It is the base class for entity classes that captures common properties of an entity: identity number, created date, and modified date. PublishableBase also implements IPublishable interface that acts as the contract for all publishable items.
As conclusion, the class model for the first phase defines core or basic entities in a blogging system. Those entities are: User, Blog, Post, and Page. By identifying some common attributes among those classes, I define abstract classes like EntityBase and PublishableBase classes. Some other classes and enumerations defined in this phase are: Culture and PublishStatus.


