Interview Notes

  • Home
  • Blog
    • Ntech Developers
    • Fanpage
    • Group
    • Github
  • Interview Notes
  • Social
    • Facebook
    • Twitter
    • Linkedin
  • About
  • Contact me

 Câu lệnh SELECT dùng để lấy các hàng từ cơ sở dữ liệu và cho phép lựa chọn một hoặc nhiều hàng hoặc cột từ một hoặc nhiều bảng.


Câu lệnh WHERE là mệnh đề được dùng để lọc kết quả bởi các điều kiện, kết quả trả về phải đáp ứng các điều kiện trong mệnh đề này. Khi đã có các table đích để lấy dữ liệu, thì chắc hẳn mới đến mệnh đề WHERE để lọc lại dữ liệu đó.

 Index database là gì?

Index là một cấu trúc dữ liệu được dùng để định vị và truy cập nhanh nhất vào dữ liệu trong các bảng database
Index là một cách tối ưu hiệu suất truy vấn database bằng việc giảm lượng truy cập vào bộ nhớ khi thực hiện truy vấn

Index có thể được tạo cho một hoặc nhiều cột trong database. Index thường được tạo mặc định cho primary key, foreign key.
Ngoài ra, ta cũng có thể tạo thêm index cho các cột nếu cần.

Cụ thể:
- Single-Column Index trong SQL
Chỉ mục cho một cột đơn là một chỉ mục được tạo dựa trên chỉ một cột trong bảng.

CREATE INDEX ten_chi_muc ON ten_bang (ten_cot);

- Unique index trong SQL
Unique index được sử dụng không chỉ để tăng hiệu suất, mà còn cho mục đích toàn vẹn dữ liệu.
Một Unique index không cho phép bất kỳ bản sao giá trị nào được chèn vào trong bảng.

CREATE UNIQUE INDEX ten_chi_muc ON ten_bang (ten_cot);

- Composite Index trong SQL
Composite Index là một chỉ mục cho hai hoặc nhiều cột trong một bảng.

CREATE INDEX ten_chi_muc ON ten_bang (cot1, cot2);

Implicit Index trong SQL
Implicit Index (có thể hiểu là chỉ mục ngầm định) là chỉ mục mà được tạo tự động bởi Database Server khi một đối tượng được tạo.
Các chỉ mục được tạo tự động cho các ràng buộc Primary key và các ràng buộc Unique.


Hai dạng Index Database:
- B-Tree: Dữ liệu index trong B-Tree được tổ chức và lưu trữ theo dạng tree, tức là có root, branch, leaf.
- Hash Index: Dữ liệu index được tổ chức theo dạng Key - Value được liên kết với nhau.

Hai loại Index phổ biến (2 loại này đều thuộc B-Tree):
- Clustered index
Một clustered index (chỉ mục được phân cụm) là một loại tệp sắp xếp thông tin trong bảng về đặc tính của chúng. Chỉ có 1 danh sách cho mỗi bảng trong database. Do đó, chỉ có 1 bản ghi nhóm đơn cho mỗi bảng.
Dưới đây là một vài đặc điểm của clustered index:
+ Lưu trữ data mặc định và lưu trữ data được sắp xếp
+ Giúp lưu trữ data và index cùng một lúc
+ Quét Clustered index và tìm kiếm inde
+ Tra cứu khóa

Ưu điểm:
+ Các clustered index là một option lý tưởng cho range hoặc group nhận được các truy vấn loại tối thiểu, tối đa hoặc đếm (count type queries).
+ Bất kỳ tìm kiếm có liên quan nào sẽ đi thẳng đến một điểm cụ thể trong thông tin với mục tiêu có thể tiếp tục đọc liên tục từ bảng.
+ Sử dụng cơ chế định vị để tìm phần tập tin ở đầu range.
+ Một kỹ thuật hay để các tìm kiếm range khi hunt key được đề cập.
+ Giảm thiểu chuyển trang và tối đa hóa các lần truy cập bộ đệm.

Nhược điểm:
+ Hạn chế di chuyển trang và tăng các tìm kiếm dự trữ.
+ Các phương pháp khác nhau cho yêu cầu không liên tiếp
+ Khiến cho nhiều phần trang nhất quán bao gồm trang thông tin giống như trang danh sách liệt kê.
+ Công việc bổ sung để chèn, cập nhật và xóa trong SQL.
+ Cần nỗ lực lâu hơn để làm mới các hồ sơ.
+ Hầu như tất cả data được chứa trong các nút dẫn của chỉ mục.

- Non-Clusterd Index
Một non-clustered index (chỉ mục không được phân cụm) lưu trữ thông tin meta trong một khu vực, đồng thời lưu trữ các tệp trong khu vực khác. Các tập tin bao gồm các con trỏ đến vị trí của thông tin đó.
Một solitary table (bảng đơn) có thể có nhiều non-bunched records (bản ghi không được nhóm) dưới dạng tệp.
Một non-clustered index được xác định trong trường không theo thứ tự của bảng và loại phương thức này cải thiện hiệu năng của các truy vấn khi chúng sử dụng các khóa không được gán làm khóa chính.
Dưới đây là một vài đặc điểm của clustered index:
+ Chỉ lưu trữ các key values
+ Con trỏ tới các hàng Chỉ mục Heap/Clustered
+ Cho phép truy cập data thứ cấp
+ Kết nối data
+ Hoạt động của Index Scan và Index Seek
+ Tạo một non-clustered index gồm cho bảng hoặc dạng view

Ưu điểm:
+ Giúp lấy dữ liệu nhanh chóng từ bảng database.
+ Giảm chi phí hơn so với clustered index.
+ Có thể được sử dụng để tạo nhiều hơn một chỉ mục vì có nhiều chỉ mục không được nhóm trong RDBMS.

Nhược điểm:
+ Lưu trữ dữ liệu theo thứ tự hợp lý nhất mà không cho phép người dùng tự sắp xếp các hàng data.
+ Quá trình tra cứu trên non-clusterd index khá tốn kém.
+ Cần có bản cập nhật tương ứng mỗi khi clustering key (khoá phân cụm) được cập nhật để lưu nó vào non-clustered index.

 Primary key của bảng nếu nó xác định duy nhất từng bộ (hàng) trong bảng đó. Nó thực thi các ràng buộc toàn vẹn đối với bảng.

Unique key cũng xác định duy nhất một bộ giá trị riêng lẻ trong một mối quan hệ.

So sánh Primary key và Unique key
Primary key
- Nó được sử dụng để làm định danh duy nhất cho mỗi hàng trong bảng.
- Nó không chấp nhận giá trị NULL
- Chỉ có duy nhất 1 primary key trong 1 bảng
- Tạo chỉ mục theo nhóm

Unique key
- Nó cũng xác định duy nhất một hàng, nhưng không là khóa chính.
- Nó chấp nhận giá trị NULL
- Có thể nhiều hơn 1 unique key  trong 1 bảng
- Tạo chỉ mục không phân cụm

 Overview

- Dummy: những object được truyền đi qua các hàm nhưng thực ra không hề được sử dụng. Chúng tồn tại chỉ để điền cho đầy đủ danh mục tham số.
- Fake: những objects có implement thực, nhưng thường là bằng một cách mưu hèn kế bẩn nào đó, với mục đích là trông y như thật. Chúng tất nhiên không phù hợp để tiêm vào môi trường production. Chẳng hạn một InMemoryTestDataBase là một ví dụ điển hình.
- Stubs: những object có phản hồi với những lời gọi hàm được tạo ra trong ca kiểm thử, và thường không phản hồi bất kỳ lời gọi nào khác.
- Spies: những stub mà có thêm hành vi ghi lại thông tin gì đấy về những hoạt dộng của chúng. Chẳng hạn một spies của dịch vụ gửi mail có thêm hành vi ghi lại thông tin rằng bao nhiêu email đã được gửi.
- Mocks: là thứ chúng ta đang nói đến trong bài viết này, những object được lập trình sẵn các kỳ vọng về lời gọi sử dụng mà chúng sẽ nhận được, cũng như cách chúng sẽ phản hồi lại.

Mock là gì?
Mock object (MO) là một đối tượng ảo mô phỏng các tính chất và hành vi giống hệt như đối tượng thực được truyền vào bên trong khối mã đang vận hành nhằm kiểm tra tính đúng đắn của các hoạt động bên trong.
Mock object có các đặc điểm sau:
- Đơn giản hơn đối tượng thực nhưng vẫn giữ được sự tương tác với các đối tượng khác.
- Không lặp lại nội dung đối tượng thực.
- Cho phép thiết lập các trạng thái riêng trợ giúp cho việc thực hiện unit test.

Stub là gì?
Stub là một chương trình hoặc thành phần giả lập (thay thế cho chương trình hoặc thành phần chưa code xong để kiểm thử) nó dùng để kiểm thử...

Fake là gì
Fake là một ý nghĩa nói chung, nó có thể chỉ tới một một object thật hoặc một object giả hoặc giả hoặc một cái gì đó không có thật.

 Mediator Pattern

Mediator Patern (mô hình trung gian) được sử dụng để giảm sự phức tạp trong "giao tiếp" giữa các lớp và các đối tượng.
Mô hình này cung cấp một lớp trung gian có nhiệm vụ xử lý thông tin liên lạc giữa các tầng lớp, hỗ trợ bảo trì mã code dễ dàng bằng cách khớp nối lỏng lẻo.
Nhằm kiểm soát cách thức giao tiếp (communication) giữa các object nên thuộc về behavioral (hành vi).
Nó sẽ loại bỏ hết tất cả các communication giữa các component.
Trường hợp ta muốn component A độc lập với các component khác, mediator sẽ xóa tất cả các liên kết tới A.
Sau khi đã xóa, Mediator Object đóng vai trò như người trung gian, tất cả giao tiếp đều phải thông qua Mediator Object.

Mediator để xác định các interface giao tiếp giữa các đối tượng tương đồng.

 - Single responsibility principle

Một class chỉ nên giữ 1 trách nhiệm duy nhất (Chỉ có thể sửa đổi class với 1 lý do duy nhất)

Class giữ cả 3 trách nhiệm: Đọc dữ liệu từ DB, xử lý dữ liệu, in kết quả. Do đó, chỉ cần ta thay đổi DB, thay đổi cách xuất kết quả, … ta sẽ phải sửa đổi class này. Càng về sau class sẽ càng phình to ra.
Theo đúng nguyên lý, ta phải tách class này ra làm 3 class riêng. Tuy số lượng class nhiều hơn những việc sửa chữa sẽ đơn giản hơn, class ngắn hơn nên cũng ít bug hơn.

- Open/closed principle
Có thể thoải mái mở rộng 1 class, nhưng không được sửa đổi bên trong class đó (open for extension but closed for modification).

Theo nguyên lý này, mỗi khi ta muốn thêm chức năng,.. cho chương trình, chúng ta nên viết class mới mở rộng class cũ ( bằng cách kế thừa hoặc sở hữu class cũ) không nên sửa đổi class cũ.

- Liskov substitution principle
Trong một chương trình, các object của class con có thể thay thế class cha mà không làm thay đổi tính đúng đắn của chương trình

Hãy tưởng tượng bạn có 1 class cha tên Vịt. Các class Vịt Bầu, Vịt Xiêm có thể kế thừa class này, chương trình chạy bình thường.
Tuy nhiên nếu ta viết class Vịt Chạy Pin, cần pin mới chạy được. Khi class này kế thừa class Vịt, vì không có pin không chạy được, sẽ gây lỗi. Đó là 1 trường hợp vi phạm nguyên lý này.

Ta có 2 class cho hình vuông và hình chữ nhật. Ai cũng biết hình vuông là hình chữ nhật có 2 cạnh bằng nhau, do đó ta có thể cho class Square kế thừa class Rectangle để tái sử dụng code.
Do hình vuông có 2 cạnh bằng nhau, mỗi khi set độ dài 1 cạnh thì ta set luôn độ dài của cạnh còn lại. Tuy nhiên, khi chạy thử, hành động này đã thay đổi hành vi của của class Rectangle, dẫn đến vi phạm LSP.
Trong trường hợp này, để code không vi phạm LSP, ta phải tạo 1 class cha là class Shape, sau đó cho Square và Rectangle kế thừa class Shape này.

- Interface segregation principle
Thay vì dùng 1 interface lớn, ta nên tách thành nhiều interface nhỏ, với nhiều mục đích cụ thể.

Hãy tưởng tượng chúng ta có 1 interface lớn, khoảng 100 methods. Việc implements sẽ khá cực khổ, ngoài ra còn có thể dư thừa vì 1 class không cần dùng hết 100 method. Khi tách interface ra thành nhiều interface nhỏ, gồm các method liên quan tới nhau, việc implement và quản lý sẽ dễ hơn.

- Dependency inversion principle
+ Các module cấp cao không nên phụ thuộc vào các modules cấp thấp. Cả 2 nên phụ thuộc vào abstraction.
+ Interface (abstraction) không nên phụ thuộc vào chi tiết, mà ngược lại. (Các class giao tiếp với nhau thông qua interface, không phải thông qua implementation)

Chúng ta đều biết 2 loại đèn: đèn tròn và đèn huỳnh quang. Chúng cùng có đuôi tròn, do đó ta có thể thay thế đèn tròn bằng đèn huỳnh quanh cho nhau 1 cách dễ dàng.
Ở đây, interface chính là đuôi tròn, implementation là bóng đèn tròn và bóng đèn huỳnh quang. Ta có thể swap dễ dàng giữa 2 loại bóng vì ổ điện chỉ quan tâm tới interface (đuôi tròn), không quan tâm tới implementation.

 

 Trong C# mỗi khi bạn sửa đổi một String kết quả đều tạo ra một đối tượng String mới. Trong khi đó StringBuilder chứa trong nó một mảng các ký tự, mảng này sẽ tự động thay thế bởi một mảng lớn hơn nếu thấy cần thiết, và copy các ký tự ở mảng cũ sang.


Nếu bạn phải thao tác ghép chuỗi nhiều lần thì bạn nên sử dụng StringBuilder, nó giúp làm tăng hiệu năng của chương trình.
Tuy nhiên nếu chỉ ghép nối một vài chuỗi thì điều đó không cần thiết, bạn không nên lạm dụng StringBuilder trong trường hợp đó.

So sánh String và StringBuilder:

- String là một đối tượng kiểu immutable (bất biến) và sealed (bị niêm phong, không có khả năng tạo ra kế thừa), nghĩa là khi bạn tạo mới một đối tượng, các giá trị của đối tượng này hoàn toàn không thể thay đổi.
Sự thay đổi giá trị của String nếu diễn ra sẽ diễn ra trên một đối tượng mới.

- StringBuilder dùng một mảng char để lưu trữ các dữ liệu.
StringBuilder được tổ chức như một danh sách liên kết, do đó việc thao tác chuỗi cơ bản như chèn, xóa, cắt, tìm kiếm chuỗi… sẽ là những thao tác trên danh sách liên kết.
StringBuilder cũng có giới hạn sức chứa dữ liệu.

Khi nào nên dùng?
- Khi muốn tối ưu hiệu năng trong quá trình xử lý chuỗi, StringBuilder tỏ ra vượt trội hơn so với String khi nghiệp vụ bạn đang xử lí đòi hỏi việc thao tác chuỗi mà giá trị chuỗi biến động với số lượng lớn.
- Tuy nhiên StringBuilder không hỗ trợ vấn đề thao tác chuỗi mạnh mẽ như String, như nhiều toán tử thao tác như +, +=, =, … cũng như các phương thức như Contains, ToList, ToArray, ...
- Nếu nghiệp vụ bạn đang xử lí yêu cầu việc thao tác chuỗi mà giá trị của chuỗi biến động ít, String hoàn toàn là sự lựa chọn hợp lí bởi sự hỗ trợ đa dạng và đầy đủ các toán tử thao tác chuỗi và phương thức tích hợp đi kèm và cả tốc độ lập trình.
Bài đăng mới hơn Bài đăng cũ hơn Trang chủ

ABOUT AUTHOR

NTechDevelopers

Follow us

New technology for developers

POPULAR POSTS

  • Interview notes: Senior Dot Net (Ver 08/2022)
    Khi nào dùng store khi nào dùng function? Phân biệt 2 loại Index? Phân biêt truncate table và delete table? Phân biệt net framework và net c...
  • Interview notes: Senior Dot Net (Ver 05/2022)
     - Giới thiệu về bản thân - Nói sơ lược về công nghệ của dự án gần nhất? - So sánh Net Framwork và Net Core? - Net core 3.1 có gì khác biệt ...
  • Interview notes: Junior DotNet (Ver 10/2019)
      1. Bài test: 30 phút Gồm 4 phần: OOP Data structure Database Design pattern 1.1 – Câu hỏi trắc nghiệm liên quan đến 4 thuộc tính 5 câu – C...

Categories

  • Concurrency
  • Database
  • Design Patterns
  • DotNet
  • Entity Framework
  • Frontend
  • Interview notes
  • OOP
  • Principles
  • Subversion Control
  • Unit test

Advertisement

Website đang trong quá trình cập nhập. Hi vọng các bạn ủng hộ!

About Me

NTechDevelopers is a community of Software development joined together with certain common goals: to learn, to teach and to have fun programming. I hope that you find NTechDevelopers to be a wealth of information and a valuable resource.

Popular Posts

  • Interview notes: Senior Dot Net (Ver 08/2022)
    Khi nào dùng store khi nào dùng function? Phân biệt 2 loại Index? Phân biêt truncate table và delete table? Phân biệt net framework và net c...

Advertisement

Copyright © 2022 Interview Notes. Created by NtechDevelopers