{
  "id": 1299703,
  "title": "Modeling Recurring vs One-Off Events in a Bilingual City Guide",
  "url": "https://urgent.news/2026/08/16/modeling-recurring-vs-one-off-events-in-a-bilingual-city-guide",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-08-16T16:00:26.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/member_5432fd74/modeling-recurring-vs-one-off-events-in-a-bilingual-city-guide-m5g"
  },
  "original_language": "en",
  "account": "In a bilingual city guide for Santa Cruz de la Sierra, events are classified as either one-off or recurring. Dated events, such as a concert on 2026-09-10, have an ISO date and a random suffix in their slugs. Recurring events, like weekly salsa nights, have a '-weekly' marker but no date in their slugs. This distinction enables the guide to route events differently. When modeled as one event row with a date column, four problems arise. First, the archive policy differs for dated and recurring events. Dated events should be removed from the listing the day after they occur while still returning a 200 status code for inbound links and indexed pages. Recurring events, however, should never fall out of the listing as they have no expiry. Mixing them in one table keyed on date causes recurring events with a null date to vanish silently. Second, schema.org/Event schema requires a startDate field, but it is not feasible to emit a valid Event for \"every Thursday\" using a single node. This assertion of a specific occurrence in a machine-readable format is incorrect. Third, internationalization (i18n) complicates the guide's URL structure. While localized path segments improve user experience and regional search, translating the slug body leads to unrelated identifiers, multiple hreflang pairs, and permanent URL forks. Translating the segment, keeping the identifier stable, and deriving hreflang pairs avoids these issues. Lastly, the source data arrives as public announcements from venues, lacking a stable identifier, schema, and update semantics. Deduplication cannot key on the title alone, as the same event is announced repeatedly with different phrasing. A composite key, including venue, date, and rough time, with title as a similarity check, is a better solution. Additionally, each record needs a verified_at timestamp separate from updated_at. updated_at indicates when the row changed, while verified_at shows when a human last confirmed the record against the source, enabling the display of staleness warnings or recheck decisions before publication. The guide, Bolivamos, uses a discriminated type instead of separate tables to address these challenges effectively.",
  "summary": "An events listing looks like a simple content type until you notice that two things share the shape and behave nothing alike. A dated concert exists once. It happens on 2026-09-10, and after that it is history. A weekly salsa night has no date at all. It happens every Thursday, indefinitely, until the venue stops running it. Model both as one Event row with a date column and you will hit the same…",
  "key_points": [
    "Dated events have ISO date and random suffix, recurring events have \"-weekly\" marker but no date",
    "Bolivamos uses a discriminated type to effectively handle these challenges"
  ],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}