Что-то, о чем здесь не упоминалось, хотя и немного похоже на вторую альтернативу принятого ответа, но отличается и невысокой стоимостью для большого иерархического запроса и простых элементов (insert update delete), будет добавлять столбец постоянных путей для каждого элемента.
some like:
id | name | path
19 | category1 | /19
20 | category2 | /19/20
21 | category3 | /19/20/21
22 | category4 | /19/20/21/22
Пример:
-- get children of category3:
SELECT * FROM my_table WHERE path LIKE '/19/20/21%'
-- Reparent an item:
UPDATE my_table SET path = REPLACE(path, '/19/20', '/15/16') WHERE path LIKE '/19/20/%'
Оптимизировать длину пути и ORDER BY path
, используя кодировку base36, вместо этого действительный числовой идентификатор пути
]
// base10 => base36
'1' => '1',
'10' => 'A',
'100' => '2S',
'1000' => 'RS',
'10000' => '7PS',
'100000' => '255S',
'1000000' => 'LFLS',
'1000000000' => 'GJDGXS',
'1000000000000' => 'CRE66I9S'
https://en.wikipedia.org/wiki/Base36
Подавление разделителя '/' с помощью фиксированной длины и отступов до encoded id
Подробное объяснение оптимизации здесь: https://bojanz.wordpress.com/2014/04/25/storing-hierarchical-data-materialized-path/
TODO
построение функции или процедуры для разделения пути для возвращающих предков одного элемента
Это фундаментальная концепция Angular для привязки свойства в шаблоне (см. Документацию , ). С помощью скобок вы связываете переменную, которая объявлена в вашем компоненте. Без скобок вы привязываете значение переменной.
Разница между formControlName
и [formControlName]
заключается в том, что в первом из них formControlName
было объявлено в FormGroup
в компоненте, во втором - в том, что было объявлено как независимое FormControl
в компоненте. 1110]
Пример:
@Component({
selector: 'app-profile-editor',
template: `
<form [formGroup]="profileForm">
<label>
First Name:
<input type="text" formControlName="firstName">
</label>
</form>
`
})
export class ProfileEditorComponent {
profileForm = new FormGroup({
firstName: new FormControl('')
});
}
@Component({
selector: 'app-profile-editor',
template: `
<form>
<label>
First Name:
<input type="text" [formControlName]="firstName">
</label>
</form>
`
})
export class ProfileEditorComponent {
firstName = new FormControl('');
}
Проверьте Angular документацию о реактивных формах .