Нещодавно я досліджував застосунок на Rails, коли помітив, що розробники відзначили стовпці бази даних як такі, що містять чутливі дані, за допомогою визначення стовпця таблиці. Багато баз даних підтримують коментарі для стовпців, ось пояснення коментаря для MySQL:
Коментар до стовпця можна вказати за допомогою опції COMMENT, довжиною до 1024 символів. Коментар відображається в запитах SHOW CREATE TABLE та SHOW FULL COLUMNS. Також він показується в стовпці COLUMN_COMMENT таблиці Information Schema COLUMNS.
У MySQL ми можемо додати коментар до стовпця під час створення або модифікації таблиці, використовуючи наступний синтаксис:
CREATE TABLE `users` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'Приклад коментаря для імені.',
`email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
-- ...
)
У Laravel ми можемо легко додавати коментарі до стовпців таблиці, використовуючи метод comment()
у міграції бази даних для існуючого або нового стовпця:
$table->string('email')
->unique()
->comment('Електронна адреса користувача для входу');
Ви можете переглянути коментарі до стовпців бази даних через структуру таблиці; ось приклад таблиці migrations
у новому застосунку Laravel:
Не всі бази даних підтримують коментарі для таблиць або стовпців, але такі бази, як MySQL і PostgreSQL, дозволяють їх додавати. Якщо ваша база даних підтримує коментарі, вони можуть слугувати корисними описами стовпця та використовуватися для допомоги розробникам у розумінні схеми.
Використання коментарів може варіюватися від легких для розуміння коментарів про стовпець до іншої контекстуальної інформації. Але що, якби ми використали щось на кшталт sensitive_data=true
для відзначення полів з чутливою інформацією користувача чи системи?
Навіть якщо ваш застосунок Laravel вже зрілий, ви можете створити міграцію, щоб позначити стовпці, що містять чутливу інформацію, для аудиту даних і допомогти у видаленні чутливої інформації під час експорту, клонування бази даних або запитів на інформацію про користувачів:
php artisan make:migration mark_columns_with_sensitive_data
Осторожно визначивши стовпці, ми можемо додати коментар у міграції для будь-якої таблиці та стовпців, які хочемо позначити як чутливі:
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->string('email')->comment('sensitive_data=true')->change();
$table->string('name')->comment('sensitive_data=true')->change();
$table->string('password')->comment('sensitive_data=true')->change();
});
Schema::table('profiles', function (Blueprint $table) {
// ...
});
}
Після виконання міграції ви побачите, що в базі даних тепер є коментарі на позначених полях:
Тепер у нас є корисні коментарі в нашому застосунку, які розробники можуть використовувати для контексту, але наші нові коментарі дозволяють виходити за межі документації! Ми можемо знайти всі стовпці, позначені як чутливі, в нашому застосунку та використовувати цю інформацію для захисту приватності, клонування бази даних та інших цілей.
Попри те, що кожна база даних різна, MySQL може запитувати таблицю інформаційної схеми, щоб знайти всі поля, позначені як чутливі. sensitive_data=true
— це конвенція, ви можете використовувати будь-яке позначення, але ось як ви можете знайти всі стовпці в базі даних:
SELECT TABLE_NAME, COLUMN_NAME, COLUMN_COMMENT
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMN_COMMENT LIKE '%sensitive_data=true%';
Ось результати з нашого прикладу:
А що, якби ми хотіли мати простий спосіб отримати всі імена чутливих стовпців для певної моделі? Існує багато способів досягти цього, але як щодо створення трейту, який наші моделі могли б використовувати для знаходження чутливих стовпців:
namespace App\Models\Concerns;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;
/**
* @mixin \Illuminate\Database\Eloquent\Model
*/
trait InteractWithSensitiveColumns
{
/**
* @return Collection
*/
public function getSensitiveColumns(): Collection
{
return $this->getConnection()
->table('INFORMATION_SCHEMA.COLUMNS')
->where('TABLE_NAME', $this->getTable())
->where('COLUMN_COMMENT', 'like', '%sensitive_data=true%')
->pluck('COLUMN_NAME');
}
}
Спробуймо цей трей для екземпляра User
моделі та подивимося, як він працює:
Зверніть увагу, що використання вищевказаного трейту зв'язує вас із MySQL для моделей, які використовують цей метод. Я не впевнений, чи є універсальний спосіб отримати цю інформацію, але майте на увазі, що даний трейт специфічний для MySQL.
Сподіваюся, ви дізналися кілька способів, як коментарі в базі даних можуть бути корисними для підтримки вашої бази даних! Незалежно від того, чи створюєте ви новий застосунок, чи працюєте над вже існуючим, ви можете почати використовувати коментарі вже зараз! Додаткову інформацію про управління вашою базою даних через міграції Laravel та моделі Eloquent можна знайти у документації щодо бази даних.