상품 분류표의 디자인

7013 단어 전자 상거래
&l

상품 분류표의 디자인


 
한가할 때 전자상거래에서 가장 자주 만나는 상품 분류표의 디자인 문제를 생각해 보았습니다. 사고 결과는 다음과 같습니다. 여러분의 평가를 환영합니다.

상품 분류표의 디자인


1 데이터베이스 디자인


가장 자주 사용하는 두 개의 표, 간단한 필드

1.1 분류표


           
코드 코드 규칙
1층 2위 10-99
기타 3위 100-999

1.2 상품 정보표


           
품목 검색용 Keywords 필드
Belong_카테고리는 분류된 상품을 검색하는 데 사용되며, 외부 키는 분류표의 코드 필드이기 때문에 특정한 종류의 모든 상품을 검색하기 쉽고belongcategory의 값은 이 상품이 어떤 종류에 속하는지 쉽게 지도할 수 있다.

2 구성 데이터


2.1 구조 트리의 분류 테스트 데이터
 
만들어진 데이터
 
 
코드
 
 
Java 코드
private int totalLevel = 5;
	
	private int brotherCount=10;

	@Before
	public void setUp() throws Exception {
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	@Rollback(false)
	public void testSave() {
		insertTestData(brotherCount);

	}

	private void insertTestData(int brotherCount) {

		insertFirstLayer(brotherCount);
		for (int i = 0; i < brotherCount; i++)
			insertOtherLayer(10 + i, brotherCount, 2);

	}

	private void insertFirstLayer(int brothersCount) {
		for (int i = 0; i < brothersCount; i++) {
			GoodsCategory first = new GoodsCategory();
			first.setName("The first layer" + i);
			first.setCode(String.valueOf(10 + i));
			first.setParentCode(String.valueOf(0));
			this.categoryDao.save(first);
		}
	}

	private void insertOtherLayer(long parent_code, int brothersCount, final int currentLevel) {
		int currentLevel_tmp = currentLevel;
		if (currentLevel > totalLevel)
			return;
		logger.debug("parent_code==" + parent_code);
		for (int k = 0; k < brothersCount; k++) {
			GoodsCategory otherlayer = new GoodsCategory();
			long code_tmp = 100;
			String current_code = String.valueOf(parent_code) + String.valueOf(code_tmp + k);
			otherlayer.setName("The " + currentLevel_tmp + " layer");
			otherlayer.setCode(current_code);
			otherlayer.setParentCode(String.valueOf(parent_code));
			this.categoryDao.save(otherlayer);
			insertOtherLayer(Long.parseLong(current_code), brothersCount, currentLevel_tmp + 1);
		} 
	}

	@Test
	public void testGetAllCategorys() {
		// fail("Not yet implemented");
		long totalRecordCount=0;
		for (int i = 1; i < totalLevel+1; i++) {
			totalRecordCount+=Math.pow(brotherCount, i);
		}
		System.out.println("totalRecordCount========"+totalRecordCount);
		
		List<GoodsCategory> goodCategories = this.categoryDao.getAll();
		System.out.println("list size======"+goodCategories.size());
		TreeHelper treeHelper = new TreeHelper(goodCategories);
		System.out.println("print tree");
		//treeHelper.printRoot();

	}
 

3 테스트 용례


3.1 트리 테스트 및 구성
 
 
public class TreeHelper {
    TreeData root = new TreeData();  
    protected final transient Logger log = LoggerFactory.getLogger(getClass());  
  
    public TreeHelper(List goodCategories) {  
        buildTree(goodCategories);  
    }  
  
    public TreeData getRoot() {  
        return root;  
    }  
  
    private void buildTree(List goodCategories) {  
        root.setCodes("0");  
        root.setName("Root");  
        TreeData td_pre = root;  
        int codelenth_pre = 0;  
        String code_pre="";  
        for (GoodsCategory goodsCategory : goodCategories) {  
            String code = goodsCategory.getCode();  
            int codelenth_current = code.length();  
            TreeData td_current = new TreeData();  
            td_current.setCodes(code);  
            td_current.setName(goodsCategory.getName());  
              
            log.info("codelenth_last="+codelenth_pre+" codelenth_current="+codelenth_current);  
            log.info("code_pre="+code_pre+" code_current="+code);  
            // create new child  
            if (codelenth_pre < codelenth_current) {  
  
                td_pre.addChild(td_current);  
                td_current.setParent(td_pre);  
                td_pre = td_current;  
                code_pre = code;  
            }  
            // add child to parent  
            else if (codelenth_pre == codelenth_current) {  
                td_pre.getParent().addChild(td_current);  
                td_current.setParent(td_pre.getParent());  
            }  
            // add child continue  
            else {  
                int dilevel = (int) Math.ceil(new Double(codelenth_pre - codelenth_current)/ 3);  
                log.info("dilevel="+dilevel);  
                for (int i = 0; i < dilevel; i++) {  
                    td_pre = td_pre.getParent();  
                    log.info("td_pre  code="+td_pre.getCodes());  
                }  
                code_pre = td_pre.getCodes();  
                  
                td_pre.getParent().addChild(td_current);  
                td_current.setParent(td_pre.getParent());  
                td_pre = td_current;  
            }  
  
            codelenth_pre = codelenth_current;  
  

좋은 웹페이지 즐겨찾기