<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ilya Mikhasik</title>
    <description>The latest articles on DEV Community by Ilya Mikhasik (@ilya_mikhasik_f8c2953d624).</description>
    <link>https://dev.to/ilya_mikhasik_f8c2953d624</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4131481%2F0798c2a9-665b-42e0-8c09-22fc6311d58c.jpg</url>
      <title>DEV Community: Ilya Mikhasik</title>
      <link>https://dev.to/ilya_mikhasik_f8c2953d624</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ilya_mikhasik_f8c2953d624"/>
    <language>en</language>
    <item>
      <title>Our System Series: User Signup. Creating Users, Profiles, and Relationships</title>
      <dc:creator>Ilya Mikhasik</dc:creator>
      <pubDate>Fri, 18 Sep 2026 12:09:31 +0000</pubDate>
      <link>https://dev.to/ilya_mikhasik_f8c2953d624/our-system-series-user-signup-creating-users-profiles-and-relationships-108</link>
      <guid>https://dev.to/ilya_mikhasik_f8c2953d624/our-system-series-user-signup-creating-users-profiles-and-relationships-108</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh8zdaoew95jn6d8mskpu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fh8zdaoew95jn6d8mskpu.png" alt="User signup part 1" width="800" height="646"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa9yh98rckm87j3w62ar6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fa9yh98rckm87j3w62ar6.png" alt="User signup part 2" width="800" height="508"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Previous: &lt;a href="https://dev.to/ilya_mikhasik_f8c2953d624/our-system-series-architecture-overview-5d6b"&gt;Architecture Overview&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the previous article, I introduced the four-tier architecture used by our system and described its graph-like data model. This article shows how those ideas come together in a practical business workflow: user registration.&lt;/p&gt;

&lt;p&gt;User registration is not limited to creating a single database record. The workflow creates a user, associates that user with a project and an account, creates a profile, associates the profile with the project, and triggers a signup email.&lt;/p&gt;

&lt;p&gt;The Signup Service coordinates the workflow, while the User Profiles Service and User Profiles Registries handle user-related data operations.&lt;/p&gt;

&lt;p&gt;The complete interaction is shown in the accompanying diagrams:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User signup, part 1.&lt;/li&gt;
&lt;li&gt;User signup, part 2.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Separating users and profiles
&lt;/h2&gt;

&lt;p&gt;The system separates user and profile entries because they contain different categories of information.&lt;/p&gt;

&lt;p&gt;A user entry contains system identity and authentication-related information. It includes the user ID, user type, registration date, login, last-login timestamp, account-status flags, and the profile_id of the associated profile.&lt;/p&gt;

&lt;p&gt;A profile entry contains personal and project-related information. It includes the profile ID, profile type, first and last names, birth date, sex, contact phone numbers, contact email addresses, main photo, project ID, and additional information such as education, specialty, registration address, and personal-data consent.&lt;/p&gt;

&lt;p&gt;The user entry references the profile through profile_id. In the usual case, user_id and profile_id have the same value. This makes it easy to correlate the two records while keeping their responsibilities separate.&lt;/p&gt;

&lt;p&gt;This separation establishes a clear boundary between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Authentication and system identity.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Personal and user-facing information.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Account and project relationships.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Access control and profile management.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Authentication-related operations can work with the user entry without loading the full profile. Profile-related operations can work with personal data without exposing authentication-specific fields such as login status or password-management flags.&lt;/p&gt;

&lt;p&gt;The user and profile are separate registry entries, but the profile_id field provides their direct association. Other relationships, such as the user’s association with an account or project, are represented through link records.&lt;/p&gt;

&lt;h2&gt;
  
  
  Registration flow
&lt;/h2&gt;

&lt;p&gt;The registration process is divided into two stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Creating the user and establishing the user’s relationships.&lt;/li&gt;
&lt;li&gt;Creating the profile and triggering the signup email.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The client sends the registration request to the Signup Service. The request contains user and profile data, together with Project-ID and Account-ID headers that provide the context for the new registration.&lt;/p&gt;

&lt;p&gt;The Signup Service coordinates the process but does not directly access the database. It delegates user and profile operations to the User Profiles Service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the user
&lt;/h2&gt;

&lt;p&gt;The User Profiles Service receives the request to create a user and encrypts the relevant data before persistence.&lt;/p&gt;

&lt;p&gt;It then asks User Profiles Registries to create a user entry. The registry service inserts the record into the users table and returns the result.&lt;/p&gt;

&lt;p&gt;The user entry contains system and authentication-related data, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User ID&lt;/li&gt;
&lt;li&gt;User type&lt;/li&gt;
&lt;li&gt;Registration date&lt;/li&gt;
&lt;li&gt;Login&lt;/li&gt;
&lt;li&gt;Last-login timestamp&lt;/li&gt;
&lt;li&gt;Account-status flags&lt;/li&gt;
&lt;li&gt;Associated profile ID&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After the user entry has been created, the User Profiles Service creates two relationships:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A project-user link&lt;/li&gt;
&lt;li&gt;An account-user link&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These links associate the new user with the project and account identified by the request headers.&lt;/p&gt;

&lt;p&gt;The relationships are stored as link records rather than as separate relationship tables. This is an example of the graph-like data model introduced in the architecture overview.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating the profile
&lt;/h2&gt;

&lt;p&gt;After the user has been created successfully, the Signup Service asks the User Profiles Service to create the profile.&lt;/p&gt;

&lt;p&gt;The User Profiles Service encrypts the relevant profile data and requests a profile entry from User Profiles Registries. The registry service stores the entry in the profiles table.&lt;/p&gt;

&lt;p&gt;The profile entry contains personal and project-related data, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Profile ID and profile type&lt;/li&gt;
&lt;li&gt;First name and last name&lt;/li&gt;
&lt;li&gt;Birth date and sex&lt;/li&gt;
&lt;li&gt;Contact phone numbers&lt;/li&gt;
&lt;li&gt;Contact email addresses&lt;/li&gt;
&lt;li&gt;Main profile photo&lt;/li&gt;
&lt;li&gt;Additional information such as education, specialty, registration address, and personal-data consent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The profile receives the identifier referenced by the user’s profile_id. In the usual case, the user ID and profile ID are the same UUID, which provides a simple one-to-one association between the two records.&lt;/p&gt;

&lt;p&gt;The User Profiles Service then creates a project-profile link, associating the profile with the project supplied during registration.&lt;/p&gt;

&lt;p&gt;At this point, the database contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A user entry containing system and authentication information&lt;/li&gt;
&lt;li&gt;A profile entry containing personal information&lt;/li&gt;
&lt;li&gt;An account-user link&lt;/li&gt;
&lt;li&gt;A project-user link&lt;/li&gt;
&lt;li&gt;A project-profile link&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After these operations succeed, the Signup Service returns the user ID and profile ID to the client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Signup email event
&lt;/h2&gt;

&lt;p&gt;Once the user and profile records have been created, the Signup Service sends a signup email event to the Event Processor.&lt;/p&gt;

&lt;p&gt;The Event Processor processes the event and sends the signup email to the user.&lt;/p&gt;

&lt;p&gt;Separating email delivery from the registration workflow keeps the Signup Service focused on creating the required entities and relationships. Email processing can be handled independently by the Event Processor rather than being implemented as part of the main registration logic.&lt;/p&gt;

&lt;p&gt;This separation also creates the possibility of handling email-specific concerns independently, such as retries, provider integration, and delivery monitoring. The exact behavior depends on the event-processing implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design considerations
&lt;/h2&gt;

&lt;p&gt;This workflow illustrates several architectural decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;User identity and personal profile data are stored separately&lt;/li&gt;
&lt;li&gt;The user entry references its profile through profile_id&lt;/li&gt;
&lt;li&gt;The same UUID is usually used for both the user and profile identifiers&lt;/li&gt;
&lt;li&gt;Account and project relationships are represented as reusable link records&lt;/li&gt;
&lt;li&gt;Application services coordinate business workflows&lt;/li&gt;
&lt;li&gt;Registry services provide generic database operations&lt;/li&gt;
&lt;li&gt;Protected data is encrypted before persistence&lt;/li&gt;
&lt;li&gt;Email delivery is delegated to a separate event-processing component&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is to keep responsibilities explicit. The Signup Service does not need to know how every table is implemented, and the registry service does not need to understand the complete business meaning of registration. Each component performs a focused part of the overall workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing perspective
&lt;/h2&gt;

&lt;p&gt;User signup demonstrates how the system’s architecture and data model work together in a real business scenario.&lt;/p&gt;

&lt;p&gt;A single registration creates several related records, but the process remains organized because each service has a defined responsibility. The Signup Service coordinates the workflow, the User Profiles Service manages user-related operations, the registry layer handles reusable persistence, and the Event Processor handles post-registration communication.&lt;/p&gt;

&lt;p&gt;The separation between users and profiles is particularly important. Authentication and system identity are kept in the user registry, while personal and project-related information is kept in the profile registry. The profile_id field connects the two records, and the shared identifier convention makes the relationship straightforward to resolve.&lt;/p&gt;

&lt;p&gt;The next article will focus on registries: what they are, why they were introduced, and how the Registry Factory reduces the amount of repetitive CRUD code required when adding new entity types.&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>webdev</category>
      <category>api</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Our System Series: Architecture Overview</title>
      <dc:creator>Ilya Mikhasik</dc:creator>
      <pubDate>Fri, 18 Sep 2026 11:53:44 +0000</pubDate>
      <link>https://dev.to/ilya_mikhasik_f8c2953d624/our-system-series-architecture-overview-5d6b</link>
      <guid>https://dev.to/ilya_mikhasik_f8c2953d624/our-system-series-architecture-overview-5d6b</guid>
      <description>&lt;p&gt;Previous: &lt;a href="https://dev.to/ilya_mikhasik_f8c2953d624/introduction-to-our-system-series-56p1"&gt;Introduction to Our System Series&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our system uses a four-tier microservices architecture:&lt;br&gt;
Frontend → Application Services → Registry Services → Database&lt;/p&gt;

&lt;p&gt;Each tier has a specific responsibility. The frontend handles user interaction, application services implement business and supporting workflows, registry services provide reusable database operations, and the database stores entities and their relationships.&lt;/p&gt;

&lt;p&gt;The system uses a graph-like data model consisting of entities and links. Entities can represent users, projects, accounts, or virtually any other type of object required by the application. Links represent relationships between entities.&lt;/p&gt;

&lt;p&gt;Instead of creating a separate relationship table for every possible pair of entities, the system uses a general links structure. A link contains the identifiers of the connected entities, its direction, type, weight, and any additional information stored as JSON.&lt;/p&gt;

&lt;p&gt;This approach allows us to introduce new entity types and relationships without redesigning the entire database schema. It also provides a flexible foundation for representing complex networks of connected objects.&lt;/p&gt;

&lt;p&gt;In the following articles, I will explain the responsibilities of the application and registry services in more detail. I will use the Signup Service as an example to show how the different tiers interact during a typical business workflow.&lt;/p&gt;

&lt;p&gt;Next: &lt;a href="https://dev.to/ilya_mikhasik_f8c2953d624/our-system-series-user-signup-creating-users-profiles-and-relationships-108"&gt;User Signup&lt;/a&gt;&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>webdev</category>
      <category>api</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Introduction to Our System Series</title>
      <dc:creator>Ilya Mikhasik</dc:creator>
      <pubDate>Fri, 18 Sep 2026 11:50:40 +0000</pubDate>
      <link>https://dev.to/ilya_mikhasik_f8c2953d624/introduction-to-our-system-series-56p1</link>
      <guid>https://dev.to/ilya_mikhasik_f8c2953d624/introduction-to-our-system-series-56p1</guid>
      <description>&lt;p&gt;Over the past few years, I have worked on several backend systems involving microservices, databases, APIs, data protection, service integration. I have often used these technologies as part of my daily work, but using a technology and being able to explain its role clearly are not the same thing.&lt;/p&gt;

&lt;p&gt;I am writing this series to take a more structured look at the systems I have been developing and the technologies behind them. Rather than creating a simple list of frameworks and tools, I want to describe how they work together in a real application and why particular design decisions were made.&lt;/p&gt;

&lt;p&gt;The series will begin with the architecture itself. I will explain how the system is divided into frontend, application, registry, and database layers, and how responsibilities are distributed between them. I will also discuss the graph-like data model used to represent entities and their relationships, as well as the Registry Factory I developed to automate the creation of CRUD services.&lt;/p&gt;

&lt;p&gt;After that, I will describe several typical business scenarios. Each scenario will be supported by service diagrams showing how requests move through the system. I will explain what each service does, how the services communicate, how data is stored, and what happens when a workflow succeeds or fails.&lt;/p&gt;

&lt;p&gt;This is also a way for me to take stock of my own experience. Writing about a system forces me to move beyond naming technologies and explain how I used them to solve concrete engineering problems. It helps identify what I understand well, what I need to investigate further, and which parts of my experience are most relevant to future projects.&lt;/p&gt;

&lt;p&gt;The articles are not intended to present the architecture as universally correct. Every system reflects its requirements, constraints, and history. My goal is instead to describe the design honestly, explain the decisions in their original context, and reflect on what worked, what was difficult, and what could be improved.&lt;/p&gt;

&lt;p&gt;I will begin with an overview of the architecture and then use user registration as the first example of how the different parts of the system work together.&lt;/p&gt;

&lt;p&gt;Next: &lt;a href="https://dev.to/ilya_mikhasik_f8c2953d624/our-system-series-architecture-overview-5d6b"&gt;Architecture Overview&lt;/a&gt;&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>webdev</category>
      <category>api</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
