اشتراکها
ایا معمار نرم افزار هستید؟
....
Becoming a software architect isn't something that simply happens overnight or with a promotion. It's a role , not a rank . It's an evolutionary process where you'll gradually gain the experience and confidence that you need to undertake the role.
...
5. Architecture collaboration: It's unusual for any software system to live in isolation and there are a number of people that need to understand it. This ranges from the immediate development team who need to understand and buy in to the architecture, right through to other stakeholders who have an interest from a security, database, operations, maintenance, support, etc point of view
اشتراکها
استفاده از C# 6 در ASP.NET 5
اشتراکها
jQuery 2.2 و 1.12 منتشر شدند
MySQL قادر به ایندکس کردن ستونهای JSON نمیباشد. برای حل این مشکل میتوانیم از generated columnها استفاده کنیم. منظور، ایجاد ستونهایی است که مقدارشان به صورت محاسبه شده و براساس ستونهای دیگر میباشد؛ به عنوان مثال جدول کاربران زیر را در نظر بگیرید:
برای کوئری گرفتن full name در حالت معمول میتوانیم از تابع CONCAT استفاده کنیم:
اما توسط generated columns میتوانیم یک ستون را به جدول کاربران اضافه کنیم که مقدارش براساس دو فیلد first_name و last_name محاسبه و مقدار دهی شود:
همانطور که مشاهده میکنید از سینتکس GENERATE ALWAYS برای ایجاد generated column استفاده شدهاست. در MySQL دو نوع generated column وجود دارد: STORED و VIRTUAL؛ تفاوت آنها نیز در نحوه ذخیرهسازی است. در حالت VIRTUAL که حالت پیشفرض است، مقادیر ذخیره نمیشوند؛ بلکه به صورت on the fly محاسبه و در خروجی نمایش داده خواهند شد. در حالیکه نوع STORED همانطور که از نامش پیداست، ذخیره خواهند شد؛ در نتیجه قابلیت ایندکسگذاری را دارد. برای تعیین نوع ستون نیز سینتکس آن اینگونه خواهد بود:
در ادامه یک generated column را برای جدول productsMetadata تعیین خواهیم کرد:
از آنجائیکه هیچ ایندکسی برای این فیلد جدید لحاظ نشده است، MySQL کل ردیفها را برای یافتن id موردنظر جستجو خواهد کرد. این مورد را میتوانید با دستور EXPLAIN نیز مشاهده کنید:
CREATE TABLE `Users` ( id int NOT NULL AUTO_INCREMENT, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, gender ENUM('Male','Female') NOT NULL, PRIMARY KEY (`id`) )
SELECT *, CONCAT(first_name, '', last_name) AS full_name FROM Users;
ALTER TABLE Users ADD COLUMN full_name TEXT GENERATED ALWAYS AS (CONCAT(first_name, ' ', last_name))
ALTER TABLE Users ADD COLUMN full_name TEXT GENERATED ALWAYS AS (CONCAT(first_name, ' ', last_name)) STORED
همچنین لازم به ذکر است که حین استفاده از generated columns باید نکات زیر را در نظر داشته باشید:
- generated columnsها نمیتوانند شامل subqueries, parameters, variables, stored procedure, user-defined functions باشند.
- بر روی یک ستون generated نمیتوان AUTO_INCREMENT گذاشت یا اینکه از یک ستون AUTO_INCREMENT برای محاسبه generated column استفاده کرد.
- کلیدهای خارجیای که در generated columnsها استفاده میشوند، قابلیت استفاده از CASCADE, SET NULL, or SET DEFAULT as ON UPDATE or ON DELETE را نخواهند داشت.
ALTER TABLE productMetadata ADD COLUMN id INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(data, '$.id'))) STORED NOT NULL
بنابراین زمانیکه یک مقدار JSON را ذخیره میکنیم، کلید اصلی از path تعیین شده استخراج شده و به عنوان یک computed column برای این جدول تعیین خواهد شد. در ادامه میتوانید جزئیات تغییر فوق را مشاهده کنید:
اکنون کوئری زیر را در نظر بگیرید که رکوردی با آیدی ۱ را بازیابی خواهد کرد:
SELECT data ->> "$.description.shortDescription" FROM productMetadata WHERE id = 1;
همانطور که مشاهده میکنید مقدار type به ALL تنظیم شدهاست؛ همچنین مقدار rows نیز تعداد ردیفهای جدول است که در اینجا ۱۳ ردیف دیتا را داریم. قاعدتاً با اضافه شدن دیتای جدید به جدول، جستجو نیز به مراتب کندتر خواهد شد. بنابراین با اضافه کردن ایندکس میتوانیم مشکل این کند بودن را رفع کنیم. به همین جهت در ادامه یک ایندکس را براساس ستون id که یک generated column است ایجاد خواهیم کرد:
CREATE INDEX idx_json_data ON productMetadata (id);
اکنون اگر یکبار دیگر کوئری قبلی را اجرا کنیم، خواهیم دید که تعداد rows به ۱ و همچنین type به ref ست شدهاند:
اشتراکها
ESLint v7.0.0 منتشر شد
اشتراکها
Rider 2018.1.1 منتشر شد
اشتراکها