You can insert a comment marker in the text itself. This marker is not displayed. As text is being changed, the marker stay embedded in the text itself and moves around as text is being edited. If the paragraph is removed then the comment can be orphaned and garbage collected later. Of course, this has nothing to do with DBs, is just pure text processing If you want a DB centric approach then the paragraphs are assigned primary keys during creation and the comments reference this primary key. As PK, of course, they never change. Order of paragraphs within text can be persisted as a relation previouscurrentnext implemented as a separate table, or as nextid and previd fields. You can also throw in versioning history. Im not a editable text storage expert so I dont know what is the state of the art Your problem, as you state it, is not a problem of text processing but a problem arrise from the use of a natural primary key paragraph position or paragraph hash. Of course, we all know that natural keys are bad because they change. In your example they change very frequently. Using surrogate keys solve the problem of PK volatility. the rest is just a modeling exercise on storing the relations order of paragraphs in text, paragraph changes as text evolves etc. Im letting as an exercise to you the problem of paragraph split during edit which shard inherits which comments and the problem of paragraph merge
paragraph, text, comment, primary, marker