• Thứ Năm, 01/07/2010 10:55 (GMT+7)

    Chọn khóa chính trong cấp mã số thuế

    Nguyễn Anh Tuấn
    Lựa chọn khóa chính khi thiết kế cơ sở dữ liệu là vấn đề đã được trao đổi khá lâu mà chưa ngã ngũ. Trong việc cấp mã số thuế, người viết mong muốn đưa ra một quan điểm nhìn từ góc độ tin học để trao đổi thêm về vấn đề quan trọng này.

    Nhiều ý kiến nhưng không khả thi

    Việc cấp mã số thuế (MST) theo cách hiện nay đã khiến nhiều người quan tâm và đã có nhiều ý kiến trao đổi, đề xuất cách thực hiện.

    Trong đó, có ý kiến sử dụng số CMND làm MST hay một ý khác đề nghị học tập cách làm của Thụy Điển. Tuy nhiên tất cả đều không khả thi.

    Ở Thụy Điển, công dân từ lúc sinh ra đến lúc mất đi chỉ mang một số duy nhất gọi là personal number (số cá nhân, gồm 10 chữ số Arab như xxxxxx-xxxx). Sau khi sinh 3 ngày, đứa trẻ được phòng hộ sinh hoàn tất mọi thủ tục để có số này. Mọi cơ quan bộ ngành đều sử dụng số 10 chữ số này. Số này được lưu trữ đầu tiên tại sở thuế. Số này đặc biệt dễ nhớ gồm 6 số đầu là ngày tháng năm sinh của người mang số, 4 số sau gọi là code (mã) riêng. Trong code này thì số thứ hai từ cuối lên nếu là số chẵn thì người đó là nữ, lẻ thì là nam. Còn các số khác mang các mã đặc thù riêng chỉ trong ngành mới biết.

    Chúng ta không áp dụng được theo cách làm của Thụy Điển vì Thuỵ Điển không phải là nước duy nhất phạm “sai lầm thông thái” sẽ liệt kê sau đây. Hàn Quốc cũng cấp mã công dân cho người dân theo cách tương tự. Cứ mỗi khi gặp cá nhân chuyển giới, cá nhân không có ngày sinh tháng đẻ vì lý do nào đó như từng trải qua chiến tranh, sinh đẻ ngoài phạm vi hệ thống chăm sóc sức khỏe chính quy, sinh vào thời khắc giao thừa mà đồng hồ của bác sỹ hay bệnh viện bị sai thì sai lầm lại có hiệu lực… Rồi cả lịch cũng thay đổi như đã xảy ra ở Nga năm 1917…

    Nhận diện MST theo cơ sở dữ liệu

    Mục đích của việc cấp MST là xác định duy nhất mỗi đối tượng chịu thuế trong CSDL và làm nhiệm vụ liên kết thông tin về đối tượng chịu thuế với các thông tin khác. MST là một khóa chính trong bảng chứa dữ liệu về các đối tượng chịu thuế. Quá trình thiết kế khóa chính đúng đắn nhận diện 2 loại khóa duy nhất cần xem xét và sẽ là sai lầm nghiêm trọng nếu không nhận ra sự khác biệt giữa 2 loại khóa đó.

    (1) Khóa logic xác định tính duy nhất của các bản ghi giúp ngăn ngừa khả năng nhập trùng dữ liệu. Khóa này thường kết hợp nhiều thuộc tính và quan hệ liên quan tới các quy định. (2) Ngược với khóa logic, khóa chính là phần tử phát sinh trong quá trình thiết kế mức vật lý để xác định duy nhất mỗi bản ghi trong CSDL. Nó được dùng để tạo khóa ngoại trong các bảng khác nhằm giúp thiết lập quan hệ giữa các bảng trong CSDL. Đây có thể coi là mục đích chủ yếu của khóa chính.

    Hệ quả của khóa chính trong việc xác định duy nhất mỗi bản ghi như sau:

    (1) Đòi hỏi khóa chính thực sự duy nhất. Các bảng thường có những khóa logic có thể dùng để phân biệt các bản ghi nhưng lại vẫn có thể lặp nhiều lần. Sự lặp lại này thường cho thấy thất bại trong việc định nghĩa đúng tiêu chí xác định một phiên bản của thực thể hay mục đích thực tế của bảng dữ liệu. Chẳng hạn như rất nhiều bản ghi có thể chứa cùng một khóa chính nhưng phân biệt với nhau bởi ngày hiệu lực và ngày hết hạn. Trong trường hợp này, bảng dữ liệu thực ra lưu giữ các thay đổi của một phiên bản cụ thể. Vậy bảng nào sẽ đại diện cho thực thể đó?

    (2) Khóa chính không bao giờ được nhận giá trị null (không, không hiệu lực). Điều này phải được tuân thủ ngay cả nếu một số yếu tố của khóa duy nhất logic chưa xác định. Trường hợp khóa chính nhận giá trị null chính là dấu hiệu cho thấy hệ thống không thể xác định rõ ràng một bản ghi đại diện cho thứ gì. Tạo 1 đơn đặt hàng mà không thể gán cho nó số hiệu riêng đến khi gửi nó cho khách hàng thì bản ghi của chúng ta biểu diễn 1 đơn đặt hàng hay 1 đơn hàng đã gửi? Nếu chúng ta tạo 1 ứng viên dự tuyển nhưng không gán số hiệu cho bản ghi đó cho tới khi nhận đủ hồ sơ thì có lẽ chúng ta đã đánh đồng ứng viên với hồ sơ dự tuyển vì sẽ phải xử lý thế nào nếu ta nhận được hồ sơ dự tuyển thứ hai (vào vị trí công việc khác) từ cùng ứng viên đó?

    (3) Khóa chính phải tuyệt đối ổn định (tức là không được phép thay đổi). Yêu cầu là không bao giờ được phép thay đổi chứ không phải là ít khi thay đổi. Hãy tưởng tượng mã của một khách hàng đã có hàng nghìn đơn hàng trong nhiều năm bị thay đổi, bạn sẽ phải cập nhật bao nhiêu bản ghi trong CSDL? Yêu cầu thứ ba luôn bị vi phạm khi hệ thống dùng khóa “thông minh” (những khóa phức hợp cho phép nhận biết tức thời các thông tin liên quan bản ghi).

    (4) Cuối cùng, giá trị của khóa chính cần được gán từ trong nội bộ hệ thống. Lý do đầu tiên là để đảm bảo tính ổn định. Số CMND có thể bị nhập sai, không xác định được hay thay đổi; Bộ phận nghiệp vụ có thể sáng tạo ra hệ thống đánh mã mới cho khách hàng; Các tổ chức bên ngoài có thể định dạng lại hay sử dụng lại mã định danh theo ý muốn của họ… Một lý do khác dẫn đến yêu cầu các khóa chính được gán trong nội bộ là chúng ta có thể định nghĩa các thực thể khác với các tổ chức bên ngoài cung cấp dữ liệu. Định nghĩa ngành nghề kinh doanh của Tổng cục Thống kê hay Ngân hàng Nhà nước có thể khác hẳn định nghĩa ngành nghề kinh doanh mà một doanh nghiệp hay ngân hàng thương mại dùng để quản lý khách hàng của họ.

    Áp dụng thực tiễn

    Nếu dùng khóa logic làm khóa chính để xác định các đơn hàng thì khóa chính ít nhất bao gồm mã khách hàng cộng mã hàng hóa (có thể còn nhiều thông tin phụ). Nếu người bán nhập nhầm mã khách hàng khi đơn hàng đã được xử lý “nửa chừng” thì sao? Có phải sửa lại khóa chính và cập nhật tất cả các bảng liên quan? Một biến thể khác của kiểu “khóa chính ghép” này là các khóa chính thể hiện quan hệ phân cấp giữa các bản ghi trong một bảng.

    Mã của 1 ngành nghề gồm 2 chữ số đầu là mã ngành cấp 1, 2 chữ số tiếp là mã ngành cấp 2… Cách làm đó sẽ gặp rắc rối khi 1 nhánh phát sinh quá nhiều nhánh, khiến số chữ số dành cho “họ” của nó không đủ cấp phát. Nếu dùng khóa thay thế do máy tính tự sinh để làm khóa chính, các nhánh con có thể đặt khóa ngoại để liên kết với nhánh cha và việc phân loại có thể thực hiện “vô tư” với bao nhiêu cấp và bao nhiêu nhánh con mỗi cấp cũng được. Và có vẻ như cách tốt để tránh những sai lầm đã nói là chọn khóa chính do máy sinh ra và không mang ý nghĩa gì.

    Nhưng điều này lại nghĩa là khóa chính phải thuộc quyền sở hữu của người quản trị dữ liệu. Khi các lập trình viên hay người dùng chiếm quyền sở hữu khóa chính, rắc rối lại xảy ra khiến mục đích thực của khóa chính bị mất. Khóa chính là nhằm xác định bản ghi một cách vật lý trong CSDL. Tuy nhiên, không nhất thiết mọi bảng đều cần 1 trường để làm khóa chính vì 1 bảng chỉ cần khóa chính nếu từng bản ghi của nó sẽ được các bảng khác tham chiếu.

    MÃ SỐ THUẾ
    1. MST là một dãy các chữ số được mã hóa theo một nguyên tắc thống nhất để cấp cho từng người nộp thuế, phí, lệ phí và các khoản thu khác theo qui định của Luật, Pháp lệnh thuế, phí và lệ phí (gọi chung là Pháp luật về thuế), bao gồm cả người nộp thuế xuất khẩu, thuế nhập khẩu. MST để nhận biết, xác định từng người nộp thuế và được quản lý thống nhất trên phạm vi toàn quốc.
    2. MST được cấu trúc là một dãy số được chia thành các nhóm như sau: N1N2 N3N4N5N6N7N8N9 N10 N11N12N13
    Trong đó:
    Hai chữ số đầu N1N2 là số phân khoảng tỉnh cấp MST được quy định theo danh mục mã phân khoảng tỉnh.
    Bảy chữ số N3N4N5N6N7N8N9 được đánh theo số thứ tự từ 0000001 đến 9999999. Chữ số N10 là chữ số kiểm tra.
    Mười số từ N1 đến N10 được cấp cho người nộp thuế độc lập và đơn vị chính.
    Ba chữ số N11N12N13 là các số thứ tự từ 001 đến 999 được đánh theo từng đơn vị trực thuộc, chi nhánh của người nộp thuế độc lập và đơn vị chính.
    3. Nguyên tắc cấp MST
    Người nộp thuế chỉ được cấp một MST duy nhất để sử dụng trong suốt quá trình hoạt động từ khi đăng ký thuế cho đến khi không còn tồn tại. MST được dùng để kê khai nộp thuế cho tất cả các loại thuế mà người nộp thuế phải nộp, kể cả trường hợp người nộp thuế kinh doanh nhiều ngành nghề khác nhau hoặc hoạt động sản xuất kinh doanh tại các địa bàn khác nhau.
    MST đã cấp không được sử dụng để cấp cho người nộp thuế khác. Doanh nghiệp, tổ chức kinh doanh khi không còn tồn tại thì MST chấm dứt hiệu lực và không được sử dụng lại.
    Riêng MST đã cấp cho người nộp thuế là chủ doanh nghiệp tư nhân, chủ hộ kinh doanh hoặc một cá nhân không thay đổi trong suốt cuộc đời của cá nhân đó, kể cả trường hợp đã ngừng hoạt động kinh doanh sau đó kinh doanh trở lại.
    Đặng Công Đức, Cục Thuế tỉnh Bình Dương (Trích Thông tư số 85/2007/TT-BTC ngày 18/7/2007 của Bộ Tài chính hướng dẫn thi hành Luật Quản lý thuế về việc đăng ký thuế)

     

    ------------------------------------------------------------------------------------------------------------
    Tài liệu tham khảo:
    * The Case for the Surrogate Key (Mike Lonigro)
    * Candidate keys: Choosing the right primary key (Alf A. Pedersen).

    ID: B1006_70