171 čitanja

Jedinstveni indeksi: Trebali bismo razmišljati dvaput (osobito na skali)

by Zhiya7m2025/05/25
Read on Terminal Reader

Predugo; Citati

Jedinstveni indeksi baze podataka zvuče prilično pouzdano, zar ne? Poslednja linija odbrane protiv dupliranja podataka. Bolji pristup je često da se nosi s većinom logike deduplikacije na sloju aplikacije.
featured image - Jedinstveni indeksi: Trebali bismo razmišljati dvaput (osobito na skali)
Zhiya HackerNoon profile picture

U "Big Tech" okruženjima (znate, vrsta sa tona korisnika, masivnih skupova podataka, i brzo razvijaju zahteve), oslanjajući se na bazu podatakaUNIQUE INDEXograničenja za sprečavanje dupliranja podataka – osim ako se radi o nečemu poput finansijskog pomirenja u kojem svaki novčić mora biti točan – iskreno, možda neće biti tako učinkovita kao što mislite. Plus, trošak održavanja ih može biti iznenađujuće visok. Bolji pristup je često rješavanje većine logike deduplikovanja na sloju aplikacije. Ako možete izbjeći korištenje jedinstvenog indeksa baze podataka, razmislite o tome, ili barem razmislite o tome vrlo pažljivo prije implementacije jednog.


Zašto sam počeo da razmišljam o jedinstvenim indeksima?

Jedinstveni indeksi baze podataka zvuče prilično pouzdano, zar ne? Poslednja linija odbrane protiv dupliranja podataka. I ja sam to mislio. Kad god je polje u tabeli trebalo da bude jedinstveno, slučajno bih udario jedinstveni indeks na njega.

Dok mi stvarnost nije dala oštar poziv za buđenje.

Prije mnogo vremena, kada je moja kosa bila puno puna, morala sam dodati kompozitni jedinstveni indeks u tablicu sa desetaka miliona redova (reci, za polja kao što sutenant_idiis_deletedTreba biti jedinstven zajedno).Zvuči jednostavno, zar ne?Pa, ceo proces promjena povlačen zadanaTokom tog vremena, zaostajanje u replikaciji majstora i robova bilo je na rollercoasteru, a mi smo stalno bili zabrinuti zbog potencijalnih prestupa usluge. Nakon toga, nisam mogao da se pitam: da li je ova "jedinstvenost" na nivou baze podataka vrijedna svih tih napora i rizika?

Zatim je postojala još jedna neugodna situacija. Poslovno mudro, svi znamouser@example.comiUSER@EXAMPLE.COMsu u stvari ista e-pošta. Vaš aplikacijski kod bi ih sigurno normalizovao (npr. u nižim slučajevima) prije nego što biste provjerili duplikate tokom registracije. Ali jedinstveni indeks baze podataka (koji je često slučaj-osjetljiv podrazumevano) to ne vidi na taj način. Ponekad, zbog povijesnih podataka ili sinhronizacije podataka sa bočnim kanalom koji nisu bili pravilno normalizovani, završili biste sa obe verzije slučaja „iste“ e-pošte u bazi podataka. U takvim slučajevima, jedinstveni indeks ili „obriše oko“ na ovu duplikat na nivou poslovanja ili, kada pokušate da popravite podatke, njegova rigidna pravila zapravo dobiju na vaš način.

Na primer, možda je "jedinstvenost e-pošte" bila dovoljna ranije, ali sada se zahtev menja na "jedinstvenost ID-a stanara + e-pošte".DROPPed i jedan noviCREATEKako koordinirate ova dva skupa operacija? Koji od njih ide prvi? Šta ako nešto pođe po zlu između? Izvršavanje takvih operacija na velikim stolovima osjeća se kao da svaki put izbacujete bombu – potpuno nervozno.

Ta iskustva su me naterala da razmišljam: u okruženjima s velikim količinama podataka, velikom konvergentnošću i brzo se mijenjajućim zahtjevima, je li tradicionalni pristup jedinstvenim indeksima još uvijek pravi?

Ovaj članak je o deljenju mojih razmišljanja o tome.


2. Jedinstveni indeksZašto mu toliko vjerujemo?

Jedinstveni indeks

Prije nego što uđem u pritužbe, hajde da budemo fer i prepoznamo zašto su jedinstveni indeksi tako popularni.

  1. Konačna zaštita integriteta podataka: Konačna prepreka za sprečavanje dupliranja podataka.
  2. Jednostavan za implementaciju: Nekoliko redova SQL-a prilikom kreiranja tabele ili dodavanja DDL-a kasnije, a vi ste gotovi.
  3. Shema kao dokumentacija: Označena je u shemi; ovo polje ne može imati duplikate.
  4. Potencijalno poboljšanje performansi upita: Budući da je to indeks, upite na ovom ključu mogu biti brže.

Ove prednosti su zaista prilično privlačne za male projekte, ili kada su volumeni podataka upravljani i poslovna logika nije previše složena.


3. UNIQUE INDEXU okviru "Big Tech" objektiva: Jesu li te prednosti još uvijek važeće?

Jedinstveni indeks

Razmotrimo svaku od gore navedenih "koristi" i vidimo da li još uvijek mogu izdržati u velikom, brzom tehnološkom okruženju.

  • "The ultimate safeguard"? Is this safeguard reliable? What exactly is it safeguarding against?

    It doesn't fully recognize business-level "duplicates"! Except the email case sensitivity issue I mentioned earlier (which could be solved by using collation but introduce more complexity in the DB layer), or phone numbers with or without +44, or usernames with or without special characters stripped... these nuances, which business logic considers "the same," are beyond the grasp of a database's simplistic "byte-for-byte identical" unique index. It can't prevent "logical duplicates" at the business layer.

    The application layer has to do the heavy lifting anyway. Since all these complex "sameness" checks must be handled in the application code (you can't just throw raw database errors at users, can you?), the application layer is the true workhorse ensuring "business data uniqueness." The database's unique index is, at best, an "auxiliary police officer" whose standards might not even align with the business rules.

    In distributed systems, it's merely a "local bodyguard." Once you shard your tables in a distributed scenario, an in-table unique index can't ensure global uniqueness. Global uniqueness then relies on ID generation services or application-level global validation. At this point, the "safeguard" provided by the local database index becomes even less significant.

    This "ultimate safeguard" might miss the mark, has limited coverage, and relying solely on it is a bit precarious.

  • "Easy to implement"? One-time setup, week-long headache.

    Adding a unique index to a brand new table is indeed just one SQL statement. But more often, you're changing the rules for an old table that's been running for ages and has accumulated mountains of data. Trying to alter a unique index on a table with tens of millions of rows (e.g., changing from a single-field unique to a composite unique) could mean several minutes of table locking! Online DDL tools might save you from service downtime, but the entire process can still be lengthy, resource-intensive, and risky.

    Agile? Not so fast! In scenarios with rapid iteration, multi-region synchronization, and compliance requirements, a single unique index change at the database level can hold you up for days. So much for agility.

    So, that initial "simplicity" is like bait compared to the "hell" of modifying it later.

  • "Schema as documentation"? The documentation might not match reality!

    Yes, a unique index in the table structure acts as a form of "technical documentation." But "documentation" can be misleading. If the "uniqueness" defined by this index doesn't align with the actual, more complex business rules (like the case-insensitivity example), then this "documentation" is not only useless but can also mislead future developers. If changing this "documentation" (i.e., modifying the unique index) involves an epic struggle, why not write down the business rules properly in actual design documents, wikis, or code comments? Those are far easier to update.

  • "A potential query performance boost"? Is the tail wagging the dog?

    This is a common misconception, or rather, an overemphasized "added value." If you simply want to speed up queries on a specific field or set of fields, you can absolutely create a regular, non-unique index for them! A non-unique index will boost query speeds just fine, and it comes without the write overhead, DDL pains, and rigid business logic constraints of a unique index.

  • Master-slave index inconsistency can instantly "paralyze" replication:

    I've seen it happen multiple times: the unique index configuration on the primary database is updated (e.g., a field is added, or a constraint is changed), but the index on the replica isn't modified in sync. Then, as soon as data changes on the primary (e.g., a row is inserted that would be considered a duplicate on the replica, or the primary can write it but the replica can't due to the incorrect/outdated index), the binlog is applied to the replica, and bam! Slave_SQL_Running: No. Replication just dies. When this happens, you get data lag, read-write splitting is affected, and it can even impact failover capabilities. What a nightmare, right?


Neka sloj aplikacije uradi posao - to je ono što je dobro!

S obzirom na sve ove probleme s jedinstvenim indeksima baze podataka, odgovornost za osiguravanje jedinstvenosti podataka prvenstveno bi trebala pasti na naš sloj aplikacija.

Prednosti rukovanja jedinstvenosti na aplikacijskom sloju su brojne:

  • Fleksibilno i precizno: Bez obzira na to što tvrtka definira kao duplikat, možemo kodirati logiku u skladu s tim – osjetljivost slučaja, oblikovanje, složeni uslovi, nazovite to.
  • Bolje korisničko iskustvo: Ako korisnik pogreši, možemo pružiti jasne, korisne povratne informacije, kao što je "Ovaj broj telefona je već registriran.
  • Efikasno rano odbacivanje: Intercept duplicira na sloju interfejsa usluga ili čak na sloju vrata, prije nego što podaci čak udare u bazu podataka, štedeći besmisleno okretanje.
  • Interface Idempotency: Ovo je moćno oružje protiv dupliciranih operacija. Ako korisnik dvaput klikne na dugme za slanje, ili mrežni problem uzrokuje retry, pravilna idempotencija na sloju aplikacije osigurava da se podaci ne dupliciraju.

Zaključak

Razmislite o korišćenju jedinstvenog indeksa samo kada njegove prednosti (obično kao apsolutni backstop podataka u krajnjim slučajevima) jasno i značajno nadmašuju bezbroj nevolja koje uzrokuje u složenim okruženjima s velikim količinama podataka i brzom iteracijom (opterećivanje agilnosti, operativna bol).

Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks